- 1. 이미지 변환 – Affine 및 Non-Affine 변환
- 2. 이미지 번역 – 움직이는 이미지 상하 좌우
- 3. 이미지 회전 – 이미지 회전
- 4. 크기 조정, 크기 조정 및 보간
- 5. 이미지 피라미드 – 크기 조정의 또 다른 방법
- 6. 자르기 – 원하는 이미지 영역 잘라 내기
- 7. 이미지를 밝게 및 어둡게하기위한 산술 연산
이전 튜토리얼에서 OpenCV에 대해 배웠고 그레이 스케일링, 채도, 히스토그램, 색상 공간, RGB 구성 요소 등과 같은 기본적인 이미지 처리를 수행했습니다. 이전 튜토리얼에서 말했듯이 OpenCV는 Open Source Commuter Vision Library 입니다. C ++, Python 및 Java 인터페이스 및 Windows, Linux, Mac OS, iOS 및 Android를 지원합니다. 따라서 Python 및 Linux 환경에서 Raspberry Pi에 쉽게 설치할 수 있습니다. 또한 OpenCV 및 연결된 카메라가있는 Raspberry Pi를 사용하여 얼굴 감지, 얼굴 잠금, 개체 추적, 자동차 번호판 감지, 홈 보안 시스템 등과 같은 많은 실시간 이미지 처리 애플리케이션을 만들 수 있습니다.
이 튜토리얼에서는 OpenCV를 사용하여 이미지 를 조작하는 방법을 볼 것 입니다. 여기에서는 OpenCV를 사용하여 이미지에 다음 기능을 적용하는 방법을 배웁니다.
- 이미지 변환 – Affine 및 Non-Affine 변환
- 이미지 번역 – 움직이는 이미지를 위, 아래, 왼쪽 및 오른쪽
- 이미지 회전 – 이미지 회전
- 크기 조정, 크기 조정 및 보간
- 이미지 피라미드 – 크기 조정의 또 다른 방법
- 자르기 – 원하는 이미지 영역 잘라 내기
- 이미지를 밝게 및 어둡게하기위한 산술 연산
1. 이미지 변환 – Affine 및 Non-Affine 변환
변형은 이미지에 적용되는 기하학적 왜곡이며, 여기서 왜곡은 확실히 실수가 아니라 이미지가 캡처 된 지점에서 발생하는 원근 문제를 수정하는 수정 유형입니다. 이미지 변환에는 Affine과 Non-Affine 의 두 가지 유형이 있습니다.
아핀 변환 은 크기 조정, 회전 및 변환의 세 가지 유형이며, 아핀 변환에서 중요한 것은 이미지 변환 전후에 선이 평행하다는 것입니다.
비-아핀 변환 또는 투영 변환은 평행도, 길이 또는 각도를 보존하지 않지만 공선 성과 입사를 보존합니다. 공선 성은 두 점이 동일한 직선에 있음을 의미합니다.
비-아핀 변환은 컴퓨터 비전에서 매우 일반적이며 다른 카메라 각도에서 생성됩니다. 비-아핀 또는 투영 변환은 호모 그래피 라고도 합니다.
2. 이미지 번역 – 움직이는 이미지 상하 좌우
이미지 변환은 x와 y 변환을 동시에 구현하면 이미지를 위, 아래, 왼쪽, 오른쪽, 심지어 대각선으로 이동하는 것입니다.
이제 이미지 번역을 수행하기 위해 opencv의 warpAffine 함수 를 사용하고, cv2.warpAffine 은 이러한 번역을 구현하는 데 사용 되지만이를 위해서는 번역 매트릭스가 필요합니다.
번역 매트릭스, T = 10 Tx
0 1 ty
T X, T y 는 이미지 이동이 발생하는 방향입니다.
여기서 T X 는 X 축 (수평)을 따라 이동합니다.
T Y 는 Y 축을 따라 이동 (수직)
# 이것은 단순히 이미지의 위치를 이동시키는 아핀 변환입니다. # 우리는 이러한 변환을 구현하기 위해 cv2.warpAffine을 사용합니다. import cv2 import numpy as np image = cv2.imread ('input.jpg') # 이미지 높이 와 너비 저장 height, width = image.shape print (image.shape) quater_height, quater_width = height / 4, width / 4 T = np.float32 (,]) img_translation = cv2.warpAffine (image, T, (width, height)) print (T) cv2.imshow ('original_image', image) cv2.waitKey (0) cv2.imshow (' 번역 ', img_translation) cv2.waitKey (0) cv2.destroyAllWindows ()
콘솔 출력- (183, 275) – 높이 및 너비
-T 매트릭스
]
3. 이미지 회전 – 이미지 회전
이미지 회전은 회전 지점이 피벗처럼 작동하는 것처럼 이미지의 한 지점 또는 이미지 중앙의 지점을 중심으로 이미지를 회전하는 것입니다.
번역에서와 같이 우리는 T 행렬을 가지고 있고, 아마도 회전에서 우리는 M 행렬을 가지고 있습니다.
회전 행렬, M 행렬 = Cosθ -Sinθ
Sinθ Cosθ
여기서 θ는 반 시계 방향으로 측정 한 회전 각도입니다.
또한 OpenCV를 사용하면 cv2.getRotationMatrix2D (rotation_center_x, rotation_center_y, angle of rotation, scale) 함수를 사용하여 이미지를 판매하고 동시에 회전 할 수 있습니다.
우리는 여전히 opencv의 warpAffine 함수를 사용하여 이미지의 회전을 얻지 만 이전 사례에서와 같이 변환 행렬 대신 회전 행렬을 사용합니다.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # 높이와 너비를 2로 나누어 이미지를 중심으로 회전합니다. rotation_matrix = cv2.getRotationMatrix2D ((width / 2, 높이 / 2), 90,1) rotated_image = cv2.warpAffine (image, rotation_matrix, (width, height)) cv2.imshow ('original image', image) cv2.waitKey (0) cv2.imshow ('rotated image ', rotated_image) cv2.waitKey (0) cv2.destroyAllWindows ()
이제 이미지가 90도 회전됩니다. 캔버스 크기는 동일하게 유지되지만 회전으로 인해 이미지 크기가 캔버스 크기에 맞지 않기 때문에 캔버스 크기 때문에 잘립니다. 배율 인수를 음수로 설정하여 조정할 수 있지만 이미지 뒤에 검은 색 배경을 허용합니다.
당신이 그것을 예측이나 추측하여 이미지의 높이와 너비를 설정하거나 이미지를 회전하는 다른 방법이 그래서입니다 전치 을하지만, 반 시계 방향으로 90도 배수에 의해 이미지를 회전합니다.
4. 크기 조정, 크기 조정 및 보간
크기 조정과 크기 조정은 아핀 변환입니다. 이미지 크기 조정은 우리가 꽤 오랫동안 해왔고 보간도 처리했습니다. 픽셀과 보간이 들어오는 곳입니다.
이미지 크기를 작게에서 크게 늘리거나 이미지 크기를 크게에서 작게로 줄이면 발생할 수 있습니다.
기술적으로 보간은 알려진 데이터 포인트의 이산 세트 내에서 새로운 데이터 포인트 (픽셀)를 구성하는 방법입니다.
있다 보간 방법의 여러 유형 을 OpenCV에서 같은
cv2.INTER_AREA – 축소 또는 다운 샘플링에 적합
cv2.INTER_NEAREST- 가장 빠름
cv2.LINEAR – 확대 / 축소 또는 업 샘플링에 적합 (기본값)
cv2.CUBIC- 더 좋음
cv2.INTER_LANCZOS4- 최고
# 크기 조정은 cv2.resize 함수를 사용하여 매우 쉽습니다. 인수는 # cv2.resize (image, dsize (출력 이미지 크기), x_scale, y_scale, interpolation) import cv2 import numpy as np image = cv2.imread ('input. jpg ') cv2.imshow ('Original_image ', image) cv2.waitKey (0) # 이미지를 원래 이미지 크기의 3/4로 만듭니다. 즉, 75 %로 축소합니다. image_scaled = cv2.resize (image, None, fx = 0.75, fy = 0.75) # 선형 보간은 open cv의 기본 방법이므로 함수로 구현할 필요가 없습니다. cv2.imshow ('scaling_linear interpolation', image_scaled) cv2.waitKey (0) # 이미지 크기를 두 배로 늘리겠습니다.img_double = cv2.resize (image, None, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) # 정확한 크기로 크기 조정하기 image_resize = cv2.resize (image, (200,300), interpolation = cv2.INTER_AREA) cv2.imshow ('scaling_exact', image_resize) cv2.waitKey (0) cv2.destroyAllWindows ()
5. 이미지 피라미드 – 크기 조정의 또 다른 방법
Pyramiding 이미지는 업 스케일링 (이미지 확대) 또는 다운 스케일링 (이미지 축소)을 의미합니다.
이는 단순히 이미지 크기를 쉽고 빠르게 조정할 수있는 다른 크기 조정 방법이며 새 이미지의 높이와 너비를 절반으로 줄입니다.
이것은 물체를 찾을 때마다 이미지의 크기를 조절하는 물체 감지기를 만들 때 유용합니다.
import cv2 image = cv2.imread ('input.jpg') small = cv2.pyrDown (image) large = cv2.pyrUp (smaller) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('작게', 작게) cv2.waitKey (0) cv2.imshow ('큰', 큰) cv2.waitKey (0) cv2.destroyAllWindows ()
더 큰 이미지에서는 원래 이미지와 같은 크기가 작은 이미지에서 더 큰 이미지로 직접 변환되기 때문에 약간 흐릿함을 알 수 있습니다. 그러나 보간하면 이미지가 확대 될 때 공간을 채우면서 보간이 픽셀을 추정하기 때문에 이전보다 이미지 품질이 향상됩니다.
이제 동일한 코드를 실행하지만 3 차 보간을 사용하면 큰 이미지의 품질이 향상됩니다. 아래 이미지는 원본 이미지, 확대 된 이미지 버전, 작은 이미지 및 작은 이미지의 큐빅 보간 버전 간의 비교를 보여줍니다.
import cv2 image = cv2.imread ('input.jpg') small = cv2.pyrDown (image) large = cv2.pyrUp (smaller) cv2.imshow ('original', image) cv2.waitKey (0) cv2.imshow ('smaller', smaller) cv2.waitKey (0) cv2.imshow ('larger', larger) cv2.waitKey (0) # 3 차 보간을 사용하여 작은 이미지에서 변환 된 큰 이미지의 품질을 높입니다. img_double = cv2.resize (smaller, 없음, fx = 2, fy = 2, interpolation = cv2.INTER_CUBIC) cv2.imshow ('scaing_cubicInterpolation', img_double) cv2.waitKey (0) cv2.destroyAllWindows ()
참고: 크기가 점점 작아지는 이미지의 여러 개의 작은 복사본을 만들거나 지속적으로 크기가 증가하는 여러 개의 큰 이미지를 만들려면 pyrDown 또는 pyrUp 함수내부에 유지 되는 for 루프 또는 while 루프를사용할 수 있습니다.
6. 자르기 – 원하는 이미지 영역 잘라 내기
이미지 자르기 란 이미지의 일부를 추출하는 것을 말합니다.
OpenCV에는 자르기 기능이 없지만 아래 코드를 사용하여 numpy 로 쉽게 수행 할 수 있습니다.
잘림 = 이미지
이미지 배열을 넣고 numpy에 인덱싱 도구 또는 방법을 사용하여 시작 행에서 끝 행으로 정의하고 시작 열에서 끝 열까지 쉼표로 구분하여 이미지를 얻기 위해 자르려는 사각형을 추출합니다.
import cv2 import numpy as np image = cv2.imread ('input.jpg') height, width = image.shape # 시작 픽셀 좌표를 가져 오자 (자르기 사각형의 왼쪽 상단) start_row, start_col = int (height *.25), INT (폭 0.25 *) #이의 픽셀 좌표를 종료하자 (오른쪽 아래) END_ROW, END_COL = INT (높이 * 0.75), INT (폭 * 0.75) 사각형을 잘라하는 #simply 사용 색인 우리가 원하는 립니다 = 이미지 cv2.imshow ("원본 이미지", 이미지) cv2.waitKey (0) cv2.imshow ("잘린 이미지", 잘림) cv2.waitKey (0) cv2.destroyAllWindows ()
참고 당신이 대신 직접 픽셀 값을 사용할 수 있습니다 START_COL 또는 START_ROW , 그들은 단지 사용자의 용이 한 식별을 얻기 위해 주어진다.
7. 이미지를 밝게 및 어둡게하기위한 산술 연산
OpenCV의 산술 연산은 기본적으로 이미지에 행렬을 더하거나 빼는 것이며, 매트릭스를 더하거나 빼는 것은 밝기의 증가 또는 감소에 영향을 미칩니다.
따라서 행렬을 더하거나 빼려면 행렬을 만들어야하며 numpy에는 이미지와 동일한 크기의 행렬을 제공 하는 np.ones 라는 함수가 있습니다.
import cv2 import numpy as np image = cv2.imread ('input.jpg') # 1의 행렬을 만든 다음 100 '의 스케일러로 곱합니다. # np.ones는 모든 이미지와 동일한 차원의 행렬을 제공합니다. 이 경우 값은 100이됩니다. M = np.ones (image.shape, dtype = "uint8") * 100 #이 행렬 M을 이미지에 추가하는 데 사용합니다 . # 밝기 증가가 추가되었습니다. = cv2.add (image, M) 을 첨가 cv2.imshow ("라이트") cv2.waitKey (0) 우리 빼기 수 #likewise 또한 휘도의 저하가 #notice 감산 = cv2.subtract (화상, M) cv2.imshow (감산 "감산") cv2.waitKey (0) cv2.destroyAllWindows ()
이것이 OpenCV를 사용하여 이미지에 다양한 이미지 처리 작업을 적용하는 방법입니다. 다음 튜토리얼에서 다른 이미지 조작 기능을 계속할 것입니다.