Python
[Python] openCV : normalization
SangRok Jung
2022. 11. 10. 15:46
반응형
임계값 영상
자동 임계값 계산
- cv2.THRESH_TRIANGLE
- Triangle 알고리즘을 이용한 자동 임계값 결정
- cv2.THRESH_OTSU
- Otsu알고리즘을 이용한 자동 임계값 결정
- cv2.ADAPTIVE_THRESH_MEAN_C
- cv2.ADAPTIVE_THRESH_GAUSSIAN_C
- 적응형 이진화
- cv2.THRESH_BINARY
- cv2.THRESH_BINARY_INV
- cv2.THRESH_TRUNC
- cv2.THRESH_TOZERO
- cv2.THRESH_TOZERO_INV
▶ 임계값 계산
- 그레이 스케일 영상에서 임계값을 이용하여 특정 영역 추출
- 임계값은 숫자를 직접 지정 하거나 자동 계산
minMaxLoc(src)¶
행렬의 최솟값, 최댓값을 찾는 minMaxLoc() 함수입니다. 이 함수는 최솟값, 최댓값이 있는 좌표 정보도 함께 알아낼 수 있습니다.
In [11]:
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', 0)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(src)
print('- src')
print('- minVal : ', minVal)
print('- maxVal : ', maxVal)
print('- minLoc : ', minLoc)
print('- maxLoc : ', maxLoc)
print('- src[minLoc[1], minLoc[0]] : ', src[minLoc[1], minLoc[0]])
print('- src[maxLoc[1], maxLoc[0]] : ', src[maxLoc[1], maxLoc[0]])
- src
- minVal : 18.0
- maxVal : 247.0
- minLoc : (265, 198)
- maxLoc : (116, 273)
- src[minLoc[1], minLoc[0]] : 18
- src[maxLoc[1], maxLoc[0]] : 247
cv2.normalize¶
dst = cv2.normalize(src, dst, alpha, beta, type_flag)
src: 정규화 이전의 데이터
dst: 정규화 이후의 데이터
alpha: 정규화 구간 1
beta: 정규화 구간 2, 구간 정규화가 아닌 경우 사용 안 함
type_flag: 정규화 알고리즘 선택 플래그 상수
In [10]:
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', 0)
dst = cv2.normalize(src, None, 100, 255, cv2.NORM_MINMAX)
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(dst)
print('- src')
print('- minVal : ', minVal)
print('- maxVal : ', maxVal)
print('- minLoc : ', minLoc)
print('- maxLoc : ', maxLoc)
print('- src[minLoc[1], minLoc[0]] : ', src[minLoc[1], minLoc[0]])
print('- src[maxLoc[1], maxLoc[0]] : ', src[maxLoc[1], maxLoc[0]])
- src
- minVal : 100.0
- maxVal : 255.0
- minLoc : (265, 198)
- maxLoc : (116, 273)
- src[minLoc[1], minLoc[0]] : 18
- src[maxLoc[1], maxLoc[0]] : 247
직접 정규화¶
In [ ]:
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', 0)
dst2 = ((src - np.min(src)) / (np.max(src)-np.min(src))) * 255
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(dst2)
print('- src')
print('- minVal : ', minVal)
print('- maxVal : ', maxVal)
print('- minLoc : ', minLoc)
print('- maxLoc : ', maxLoc)
print('- src[minLoc[1], minLoc[0]] : ', src[minLoc[1], minLoc[0]])
print('- src[maxLoc[1], maxLoc[0]] : ', src[maxLoc[1], maxLoc[0]])
cv2.imshow("dst2", np.uint(dst2))
cv2.waitKey()
cv2.destroyAllWindows()
In [ ]:
dst = cv2.normalize(src, None, 100, 255, cv2.NORM_MINMAX)
dst1 = cv2.normalize(src, None, 0, 255, cv2.NORM_MINMAX)
dst2 = ((src - np.min(src)) / (np.max(src) - np.min(src))) * 255
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(dst)
min_val1, max_val1, min_loc1, max_loc1 = cv2.minMaxLoc(dst1)
print(minVal, maxVal)
print(min_val, max_val)
print(min_val1, max_val1)
print(minLoc, maxLoc)
print(min_loc, max_loc)
print(min_loc1, max_loc1)
cv2.imshow(‘src’, src)
cv2.imshow(‘dst’, dst)
cv2.imshow(‘dst1’, dst1)
cv2.imshow(‘dst2’, np.uint8(dst2))
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
자동 임계값 계산¶
cv2.THRESH_BINARY : 삼각 알고리즘을 이용한 자동 임계값 설정
cv2.OTSU : otsu알고리즘을 이용한 임계값 설정
In [ ]:
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', 0)
ret, dst = cv2.threshold(src, 200, 255, cv2.THRESH_BINARY)
ret2, dst2 = cv2.threshold(src, 200, 255, cv2.THRESH_OTSU)
ret3, dst3 = cv2.threshold(src, 200, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
print('ret=', ret)
cv2.imshow('src', src)
cv2.imshow('dst', dst)
cv2.imshow('dst2', dst2)
cv2.imshow('dst3', dst3)
cv2.waitKey()
cv2.destroyAllWindows()
cv2.waitKey(1)
In [ ]:
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('images/noise.png',0)
# global thresholding
ret1, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret2, th2 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
blur = cv2.GaussianBlur(img,(5,5),0)
ret3, th3 = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# plot all the images and their histograms
images = [img, 0, th1, img, 0, th2, blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', 'Original Noisy Image','Histogram',"Otsu's Thresholding", 'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(3):
plt.subplot(3,3,i*3+1), plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2), plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3), plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()
자동 임계값 계산¶
Mean방식은 지정된 영역의 이웃 픽셀의 평균으로 threshold를 결정하는 방법
Gaussian 방식은 가우시안 분포에 따른 가중치의 합으로 threshold를 결정하는 방법
Parameters:
• src – grayscale image
• maxValue – 임계값
• adaptiveMethod – thresholding value를 결정하는 계산 방법(mean, gaussian 방식)
• thresholdType – threshold 방법
• blockSize – thresholding을 적용할 영역 사이즈, 홀수(3, 5, 7, ...)
In [8]:
import cv2
import numpy as np
src = cv2.imread('./image/lena.jpg', cv2.IMREAD_GRAYSCALE)
ret, dst = cv2.threshold(src, 200, 255, cv2.THRESH_BINARY)
ret4, dst4 = cv2.threshold(src, 200, 255, cv2.THRESH_BINARY+cv2.THRESH_OTSU)
print('global threshold=', ret4)
dst5 = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 51, 0)
dst6 = cv2.adaptiveThreshold(src, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 51, 0)
d_list = [dst, dst4, dst5, dst6]
for i in d_list :
minVal, maxVal, minLoc, maxLoc = cv2.minMaxLoc(i)
print('\n- src')
print('- minVal : ', minVal)
print('- maxVal : ', maxVal)
print('- minLoc : ', minLoc)
print('- maxLoc : ', maxLoc)
print('- src[minLoc[1], minLoc[0]] : ', src[minLoc[1], minLoc[0]])
print('- src[maxLoc[1], maxLoc[0]] : ', src[maxLoc[1], maxLoc[0]])
cv2.imshow('dst', dst)
cv2.imshow('dst4', dst4)
cv2.imshow('dst5', dst5)
cv2.imshow('dst6', dst6)
cv2.waitKey()
cv2.destroyAllWindows()
global threshold= 117.0
- src
- minVal : 0.0
- maxVal : 255.0
- minLoc : (0, 0)
- maxLoc : (406, 0)
- src[minLoc[1], minLoc[0]] : 163
- src[maxLoc[1], maxLoc[0]] : 208
- src
- minVal : 0.0
- maxVal : 255.0
- minLoc : (63, 0)
- maxLoc : (0, 0)
- src[minLoc[1], minLoc[0]] : 105
- src[maxLoc[1], maxLoc[0]] : 163
- src
- minVal : 0.0
- maxVal : 255.0
- minLoc : (5, 0)
- maxLoc : (0, 0)
- src[minLoc[1], minLoc[0]] : 157
- src[maxLoc[1], maxLoc[0]] : 163
- src
- minVal : 0.0
- maxVal : 255.0
- minLoc : (2, 0)
- maxLoc : (0, 0)
- src[minLoc[1], minLoc[0]] : 161
- src[maxLoc[1], maxLoc[0]] : 163
반응형