cv2 이미지 처리

qkdk·2024년 8월 20일

openCV

목록 보기
2/15
post-thumbnail

이미지 임계 처리(이진화)

사용하는 이유
경계값을 기준으로 이미지를 이진화 하면 물체가 뚜렷해져, 객체 팀지를 편하게 하기 위함

cv2.threshold

# Syntex
retval, thresholded_image = cv2.threshold(src, thresh, maxval, type)

# Example
img = cv2.imread('/content/giraffes.jpg',0)
ret, thresh1 = cv2.threshold(img, 127,255, cv2.THRESH_BINARY)
  • retval : 이미지 임계값(OTSU 처럼 자동으로 * 임계값을 구하는 경우 유용)
  • thresholded_image : 이진화된 이미지
  • src : 원본 이미지
  • thresh : 사용할 임계값
  • maxval : 임계값을 넘을경우 할당될 값
  • type : 임계값 적용방법

threshold Type

적응형 이진화

이미지를 여러 영역으로 나누고, 그 주변 픽셀값만을 활용해서 임계값을 구하는 이진화 방법

# Syntex
img = adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)

# Example
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,8) # Play around with these last 2 numbers
  • src: 입력 그레이스케일 이미지.
  • maxValue: 임계값을 초과하는 경우 할당할 값.
  • adaptiveMethod: 임계값을 계산하는 방법.
    • cv2.ADAPTIVE_THRESH_MEAN_C: 평균을 사용.
    • cv2.ADAPTIVE_THRESH_GAUSSIAN_C: 가우시안 가중치를 사용.
  • thresholdType: 임계값 유형.
  • blockSize: 임계값을 계산할 영역의 크기 (홀수).
  • C: 계산된 임계값에서 빼는 상수값. 일반적으로 주변 조명의 영향을 보정하기 위해 사용



이진화 이미지 비교

OriginalTHRESH_BINARYADAPTIVE_THRESH_MEAN_C

블러 및 스무딩

엣지를 검출하거나, 노이즈를 제거할때 사용하는 기법

Gamma Collection

이미지를 좀 더 밝거나 어둡게 만드는 방법

이미지 커널

cv2.filter2D

2D Convolution 연산을 진행하는 필터
Convlution(합성곱) 연산 커널에 따라 블러링, 샤프닝, 경계선 감지 가능

# Syntex
dst = cv2.filter2D(src, ddepth, kernel)

# Example
kernel = np.ones(shape=(5,5),dtype=np.float32)/25
# --> 나누어주는 값에 따라 블러링 정도를 조절할 수 있다
# --> 평균값으로 블러링하기 위해서 필셀수만큼 나누어 주면 된다.
dst = cv2.filter2D(img,-1,kernel)
  • src: 입력 이미지.
  • ddepth: 출력 이미지의 깊이. 일반적으로 입력 이미지와 같은 깊이를 사용 (-1).
  • kernel: 컨볼루션 커널 (필터), 행렬(matrix) 형식.

cv2.blur (Average)

위에서 설명한 cv2.filter2D 연산을 블러링을 위해 수행
cv2에서 따로 블러링 커널을 만들지 않아도 편하게 사용할수 있도록 만든 함수
평균값으로 블러링을 수행

# Example
blurred_img = cv2.blur(img,ksize=(5,5))

cv2.GaussianBlur

이미지에 가우스 함수를 Convolution 연산에 적용해 필터링 하는 방법

# Syntex
dst = cv2.GaussianBlur(src, ksize, sigmaX[, sigmaY[, borderType]])

# Example
blurred_img = cv2.GaussianBlur(img,(5,5),10)

cv2.medianBlur

matrix안의 값을 정렬하고 그 중앙값을 할당하는 방법
다른 Blur에 비해 엣지 보존효과가 띄어나며, 소금과 후추 노이즈 에 효과적인 블러링이 가능

# Example
dst = cv2.medianBlur(src, ksize)
# Syntex
median = cv2.medianBlur(img,5)

블러별 이미지 비교

OriginalAverageGausianMedian

모폴로지 연산 (이미지 형태 전환)

cv2.erode

이미지를 침식하여 객체의 경계를 줄이는 기능.
커널 내부의 값이 전부 1일때 1로 표현

# Syntex
dst = cv2.erode(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
  • src: 입력 이미지.
  • kernel: 침식 연산에 사용되는 커널(구조 요소). 일반적으로 np.ones((5, 5), np.uint8) 형태로 정의됩니다.
  • dst: 출력 이미지. (옵션)
  • anchor: 커널의 고정점. 기본값은 (-1, -1)입니다.
  • iterations: 형태학적 변환을 반복할 횟수. 기본값은 1입니다.
  • borderType: 가장자리 픽셀의 패딩 유형. 기본값은 cv2.BORDER_CONSTANT입니다.
  • borderValue: 가장자리 픽셀의 값. 기본값은 0입니다.

cv2.dilate

이미지를 팽창하여 객체의 경계를 확장하는 기능
커널 내부의 하나의 픽셀이라도 1이라면 1

# Syntex
dst = cv2.dilate(src, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
  • cv2.erode 와 매개변수 동일

cv2.morphologyEx

# Syntex
dst = cv2.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]])
  • src: 입력 이미지.
  • op: 적용할 형태학적 연산의 종류. cv2.MORPH_OPEN, cv2.MORPH_CLOSE, cv2.MORPH_GRADIENT 등을 지정할 수 있습니다.
  • kernel: 형태학적 연산에 사용되는 커널(구조 요소).
  • dst: 출력 이미지. (옵션)
  • anchor: 커널의 고정점. 기본값은 (-1, -1)입니다.
  • iterations: 형태학적 변환을 반복할 횟수. 기본값은 1입니다.
  • borderType: 가장자리 픽셀의 패딩 유형. 기본값은 cv2.BORDER_CONSTANT입니다.
  • borderValue: 가장자리 픽셀에 사용되는 값. 기본값은 0입니다.

cv2.MORPH_OPEN

침식 연산후 팽창 연산을 적용하는 기법
주변보다 밝은 노이즈를 제거하는데 효과적, 객체 외부의 노이즈 제거

# Example
opening = cv2.morphologyEx(noise_img, cv2.MORPH_OPEN, kernel)
OriginalMORPH_OPEN

cv2.MORPH_CLOSE

팽창 연산후 닫힘 연산을 적용하는 기법
주변보다 어두운 노이즈를 제거하는데 효과적, 객체 내부의 노이즈 제거

# Example
closing = cv2.morphologyEx(black_noise_img, cv2.MORPH_CLOSE, kernel)
OriginalMORPH_CLOSE

cv2.MORPH_GRADIENT

팽창 연산 결과에 닫힘 연산을 뺀것
객체의 경계를 강조

# Example
gradient = cv2.morphologyEx(img,cv2.MORPH_GRADIENT,kernel)
OriginalMORPH_GRADIENT

Gradient

이미지의 경계선(edge)를 찾는 기법
이미지 내의 픽셀값 변화가 큰 부분은 일반적으로 경계선, 및 모서리 부분이다.

이미지 임계처리, 모폴로지 연산 등과 함께 사용해, 경계선 탐색을 진행한다.

sobel

중심 필터의 차분 비중을 2배로
기존 중심 가중치가 없는 프리윗 필터 대비 대각선 검출 성능 좋음

좌우, 혹은 상하의 차이를 구하기 위해 위 그림 처럼 행렬을 구성하고 원본 이미지와 convolution을 진행, 차이가 크다면 edge, 차이가 작다면 edge가 아니다.

# Syntex
dst = cv2.Sobel(src, ddepth, dx, dy, ksize[, scale[, delta[, borderType]]])

# Example
sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=5)
blended = cv2.addWeighted(src1=sobelx,alpha=0.5,src2=sobely,beta=0.5,gamma=0)
  • src: 입력 이미지. CV_8U, CV_16U, CV_16S, CV_32F 또는 CV_64F 타입이 될 수 있습니다.
  • ddepth: 출력 이미지의 깊이. -1이면 입력 이미지와 동일한 깊이로 설정됩니다. 일반적으로 cv2.CV_64F를 사용합니다.
  • dx: x 방향으로 미분 차수를 나타냅니다. 수평 방향 그래디언트를 계산할 때는 1로 설정합니다.
  • dy: y 방향으로 미분 차수를 나타냅니다. 수직 방향 그래디언트를 계산할 때는 1로 설정합니다.
  • ksize: Sobel 커널의 크기를 나타냅니다. 일반적으로 1, 3, 5, 7 등의 홀수 값을 사용합니다.
  • scale (선택적): 적용할 스케일 팩터입니다. 기본값은 1입니다.
  • delta (선택적): 결과에 추가되는 값입니다. 기본값은 0입니다.
  • borderType (선택적): 가장자리 픽셀의 보간 방법입니다. 기본값은 cv2.BORDER_DEFAULT입니다.
OriginalSobleXSobelYCombine

laplacian

2차 미분을 활용한 Gradient, dy, dx 한번에 검출이 가능하다.

Laplacian(I)=2Ix2+2Iy2\text{Laplacian}(I) = \frac{\partial^2 I}{\partial x^2} + \frac{\partial^2 I}{\partial y^2}
L=[010141010]L = \begin{bmatrix} 0 & -1 & 0 \\ -1 & 4 & -1 \\ 0 & -1 & 0 \end{bmatrix}
L=[111181111]L = \begin{bmatrix} -1 & -1 & -1 \\ -1 & 8 & -1 \\ -1 & -1 & -1 \end{bmatrix}

위 식 처럼 중앙과 나머지 값들의 합이 0인 커널을 이용해 연산을 수행한다.

# Syntex
dst = cv2.Laplacian(src, ddepth[, ksize[, scale[, delta[, borderType]]]])

# Example
laplacian = cv2.Laplacian(img,cv2.CV_64F)
  • cv2.Sobel과 dy, dx 제외 동일

히스토그램

이미지의 필셀 값의 분포를 계산하여 히스토그램(표)를 생성하는 기능

cv2.calcHist

# Syntex
hist = cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])

# Example
img = blue_bricks
color = ('b','g','r')
for i,col in enumerate(color):
    histr = cv2.calcHist([img],[i],None,[256],[0,256])
    plt.plot(histr,color = col)
    plt.xlim([0,256])
plt.title('Blue Bricks Image')
plt.show()
  • images: 입력 이미지. 일반적으로 [image] 형태로 입력합니다.
  • channels: 히스토그램을 계산할 채널 인덱스. 예를 들어, 그레이스케일 이미지의 경우 [0]을 사용하고 컬러 이미지(BGR)의 경우 각 채널을 독립적으로 분석할 때 [0], [1], [2]을 사용합니다.
  • mask: 마스크 이미지. 히스토그램을 특정 영역에 대해서만 계산할 때 사용하며, 전체 이미지를 대상으로 할 경우 None을 사용합니다.
  • histSize: 히스토그램 각 차원의 빈(bin) 개수. 예를 들어, [256]은 각 채널에 대해 256개의 빈을 생성하라는 의미입니다.
  • ranges: 히스토그램 각 차원의 값 범위. 예를 들어, [0, 256]은 픽셀 값의 범위가 0에서 256 사이임을 의미합니다.
  • hist (선택적): 초기 히스토그램을 지정합니다. 일반적으로 None을 사용합니다.
  • accumulate (선택적): 히스토그램을 누적할지를 지정합니다. 기본값은 False입니다.

cv2.equalizeHist

히스토그램을 평활화(히스토그램을 평평하게 만듬)하여 이미지의 대비를 늘리는 방법

컬러 이미지의 경우 RGB(BGR) 형식을 HSV 형식으로 변환하여야 한다.

# Syntex
equalized_image = cv2.equalizeHist(src)


# Exampe
eq_gorilla = cv2.equalizeHist(gorilla)
OriginalequalizeHist
profile
qkdk

0개의 댓글