전공 과목 이수2👨‍💻/디지털영상처리

엣지검출 pyplot.imshow vs cv.imshow

천숭이 2021. 10. 10. 02:24

# pyplot.imshow   vs   cv.imshow

1) pyplot.imshow()
1채널, 부동소수 영상은 부호가 있는 수를 표현할 때 매우 편리하다.
데이터의 범위나 자료형에 영향 받지 않고 최소, 최대를 구해 자체 정규화(흑백일때)하여 출력한다.
cmap 파라미터의 설정에 따라 여러 color map을 활용한 영상 출력을 시도할 수 있다.
cv.imshow() 처럼 흑백 모노 그레이로 표현하려면 cmap='gray'로 설정하여야 한다.
그렇지 않으면 default pseudo color map이 선택되어 칼라로 1채널 영상이 출력된다.

2) cv.imshow() 함수의 출력 범위
부동소수 데이터: 0~1의 값만 출력한다. 음수는 0으로 간주하고 1을 넘는 값은 1로 간주한다.
정수형 데이터: 0~255만 출력한다. signed int도 unsigned number로 간주한다.
부동소수 혹은 unit8만 받아들인다.
uint8이면 연산 중 발생한 8비트를 넘거나 음의 정수도 모두 하위 8비트만 취하여 출력한다.

 

# np.clip()

np.clip(array,min,max)
--> array내에서 min보다 작은 수는 min으로 대체하고
max보다 큰 값은 max로 대체한다

 np.imshow 이용한 소벨필터 활용

 

# 소벨필터

dst=cv.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]
--> (이미지, 저장될Mat형식, x축미분, y축미분,소벨커널사이즈k)

 

1단계. 이미지 크기 정규화(전처리)

img = img/255       # 영상을 0~1의 부동소수로 만드는 것이 처리에 효울적이다.

2단계. Sobel() 함수로 x방향의 소벨 미분

# 출력결과는 CV_64F 부동소수이다.
sobelx = cv.Sobel(img, cv.CV_64F, 1, 0, ksize=k)

imshow는 음수값이 없다는 것을 확인하기 위해, - 데이터들을 +로 억지로 바꿔서 출력해 비교.

# + 성분만 출력해 본다. 이 결과가 (2a)의 출력 결과와 같다.
# imshow()는 -성분은 값은 0으로 간주하고, +만 출력한다는 사실을 알 수 있다.
plus_compX = sobelx * (sobelx > 0)      # (sobelx > 0)는 논리 연산. 1과 0으로 된 어레이를 반환한다.
cv.imshow('2b. sobel in x, + only ', plus_compX)

# - 성분만 출력. imshow()는 +만 출력가능하므로 -성분을 추려 부호를 +로 바꾸어 출력함.
minus_compX = -sobelx * (sobelx < 0)
cv.imshow('2c. sobel in x, - only ', minus_compX)
cv.waitKey()

첫번째 : 틀린 방법. x축 y축 부호가 다를 경우 상쇄된다

두번째 : 옳은 방법

세번째 : 최대 값이 1이 되도록 정규화 (강조x)