본문 바로가기

전체 글

(164)
분할(segmentation) (1) 1. 컨투어(contour) ■ 컨투어는 일반적으로 등고선을 의미하며, 등고선은 지형의 높이를 하나의 선으로 표시하여 지형의 형태를 쉽게 인식할 수 있도록 해준다.■ 이와 유사하게, 영상 처리에서는 객체의 외곽선(contour)을 정의하는데, 이는 객체 영역의 픽셀 중 배경과 인접한 일련의 최외곽 픽셀을 따라 그려진 선을 의미한다.■ 보통 배경은 검은색, 전경(객체 영역)은 흰색으로 구성된 바이너리 이미지에서 가장 외곽에 있는 픽셀들을 찾아 컨투어를 그리면 객체의 모양을 정확하게 인식할 수 있다.■ OpenCV에서는 컨투어 함수 cv2.findContours(src, mode, method, contours, hierarchy, offset)를 제공한다.- src는 입력, 바이너리 이미지- mode는 외..
모폴로지(Morphology) 연산, 이미지 피라미드(Image Pyramid) 1. 모폴로지 연산■ 모폴로지 연산은 노이즈 제거, 구멍 채우기, 끊어진 선 이어 붙이기 등에 사용되며 그레이스케일 영상과 바이너리(binary) 영상에 모두 적용 가능하다. ■ 주로 검은색과 흰색으로만 구성되어 있는 이진화된 영상에서 객체 모양을 변형하는 용도로 사용된다. ■ 모폴로지 연산으로 침식, 팽창, 열림, 닫힘 연산이 있다. 해당 연산들을 알기 위해서는 먼저 구조화 요소(structuring element)에 대해 알아야 한다.■ 구조화 요소는 마치 필터링에 사용되는 마스크처럼 사용되는 0과 1로 구성된 작은 크기의 행렬이다. ■ 구조화 요소는 1이 채워진 모양에 따라 다양한 모양(사각형, 타원형, 십자형 등)으로 정의할 수 있다.■ 구조화 요소 행렬에서 노란색으로 표시한 원소는 모폴로지 ..
필터와 블러링 1. 컨볼루션(Convolution) 과 필터(Filter)■ 영상 처리에서 인접 픽셀 값들을 참조하여 새로운 픽셀 값을 얻는 것을 공간 필터링(spacial filtering)이라 한다.  ■ 이 필터링은 컨볼루션 연산을 이용해 커널(필터)을 영상 전체에 적용함으로써 이루어진다. ■ 다음 그림은 3 x 3 필터를 사용한 컨볼루션 연산 예시이다. ■ OpenCV에서 cv2.filter2D(src, ddepth, kernel, dst, anchor, delta, borderType) 함수로 컨볼루션 연산을 수행할 수 있다. - src는 입력 영상/이미지 (배열) - ddepth는 결과 이미지의 깊이(비트 단위: 8, 16, 32 등), -1로 지정하면 입력과 동일한 깊이 사용 - kernel은 커널(필터)..
기하학적 변환 (2) https://hyeon-jae.tistory.com/119 기하학적 변환 (1)1. 이동(Translation)■ 기존 좌표를 \( x_{\text{old}}, y_{\text{old}} \)라고 했을 때, 이미지를 이동하는 방법은 기존 좌표에 이동시키려는 거리 \( d_1, d_2 \)를 더해주면 된다. \[ \begin{cases} x_{\text{new}} = x_{\hyeon-jae.tistory.com■ 이미지 이동, 확대/축소, 회전, 어핀 변환, 원근 변환은 모두 변환 행렬을 이용해서 이미지 변환을 수행할 수 있었다. ■ 하지만, 변환 행렬로 구할 수 없는 모양의 변환이 있는데, 바로 렌즈 왜곡 변환이다. ■ 렌즈 왜곡 변환에는 리매핑, 오목 렌즈/볼록 렌즈 왜곡, 방사 왜곡이 있다. 1...
기하학적 변환 (1) 1. 이동(Translation)■ 기존 좌표를 \( x_{\text{old}}, y_{\text{old}} \)라고 했을 때, 이미지를 이동하는 방법은 기존 좌표에 이동시키려는 거리 \( d_1, d_2 \)를 더해주면 된다. \[ \begin{cases} x_{\text{new}} = x_{\text{old}} + d_1 \\ y_{\text{new}} = y_{\text{old}} + d_2 \end{cases} \Leftrightarrow \begin{cases} x_{\text{new}} = 1x_{\text{old}} + 0y_{\text{old}} + d_1 \\ y_{\text{new}} = 0x_{\text{old}} + 1y_{\text{old}} + d_2 \end{cases} \] ..
이미지 프로세싱 (3) 1. 1D 히스토그램■ 1차원 히스토그램은 도수 분포표를 그래프로 나타낸 것이다.■ 전체 영상/이미지의 픽셀 값 중 픽셀 값 1이 몇 개인지, 2가 몇 개인지, ... , 255가 몇 개인지 히스토그램으로 나타내면 전체 영상/이미지에서 픽셀들의 색상이나 명암의 분포를 파악할 수 있다. ■ OpenCV에서는 cv2.calHist(img, channel, mask, histSize, ranges) 함수로 영상/이미지에 대한 히스토그램을 생성할 수 있다. - img는 영상/이미지로  리스트([img])로 값을 전달해야 한다. - channel은 분석할 채널이며 리스트로 값을 전달해야 한다. 예를 들어 BGRA에서 Blue 채널을 분석하고 싶으면 Blue 채널의 인덱스는 0이므로 [0]을 전달하면 된다. - m..
이미지 프로세싱 (2) 1. 이미지 연산■ OpenCV에서 한 픽셀이 가질 수 있는 값의 범위는 0~255이므로 이미지 연산 결과, 값이 0보다 작거나 255보다 큰 경우 값을 0~255 범위 내로 제한해야 한다.■ OpenCV에서는 값의 범위를 제한해 주는 사칙 연산 함수를 제공하며, 해당 함수들은 결괏값을 0보다 작은 값은 0으로, 255보다 큰 값은 255로 처리해서 0~255로 값의 범위를 제한하고 정숫값만 사용한다.■ OpenCV 사칙 연산 함수는 다음과 같다.(1) cv2.add(src1, src2, dest, mask, dtype)- 입력으로 들어오는 두 배열 혹은 배열과 스칼라의 각 원소 간 합을 계산한다.- scr1과 src2는 첫 번째 입력 이미지, 두 번째 입력 이미지이며,- dest는 계산된 결과의 출력 ..
이미지 프로세싱 (1) 1. 관심 영역(Region Of Interest, ROI)■ 관심 영역(ROI)은 이미지에서 분석 대상으로 지정한 특정 부분을 의미한다. 전체 이미지를 처리하는 대신 관심 있는 부분만 잘라내 처리함으로써 연산 효율성을 높일 수 있다. ■ cv2.imread( )로 이미지를 읽으면 이미지 데이터를 넘파이 배열로 반환하기 때문에 슬라이싱을 이용하여 관심 영역만 잘라낼 수 있다. img[y:y+h, x:x+w] y, x는 관심 영역 시작점, h, w는 영역의 폭 ■ img[y:y+h, x:x+w], 이렇게 데이터의 양을 줄이면 이미지 형태가 단순화되어 알고리즘 적용과 좌표 계산이 용이해진다.import cv2from matplotlib import pyplot as pltimg = cv2.imread('i..