728x90
# Task1 : 히스토그램 계산 
# cv2.calcHist([images], [channels], mask(None으로하자), [histSize], [ranges], hist=None, accumulate=None)

# 1-1) ROI지정, 히스토그램 계산
roi = cv2.imread('coin.jpg')
hsv_roi = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV) # HSV평면으로 이동(색,채도,밝기)(180,256,256)
hist_roi = cv2.calcHist([hsv_roi], [0,2],None, [180, 256], [0,180 ,0,256]) # H, V영역 히스토그램 계산
# -----> 이건 뒤늦게 찾은 오류인데 ROI의 H S영역이 아니고 H V영역을 히스토그램 뽑아서 타겟의 H,S에다 역투영 시켰는데 객체가 너무 잘뽑힘 

# 1-2) target지정, 히스토그램 계산, 역투영
# cv2.calcBackProject([images], [channels], [hist], [ranges], scale(=1로해야 크기 유지), dst=None)

src = cv2.imread('coins.jpg')
target = cv2.resize(src, (600,400),cv2.INTER_AREA)#사진이 너무 커서 줄임
hsvt = cv2.cvtColor(target, cv2.COLOR_BGR2HSV) #객체 따낼 사진도 hsv평면으로 옮기고
hist_tar = cv2.calcHist([hsvt], [0,1], None, [180, 256], [0,180 ,0,256]) # 타겟의 히스토그램을 구함
dst = cv2.calcBackProject([hsvt], [0,1], hist_roi, [0,180 ,0,256], 1) #dst는 타겟 히스토그램에다가  아까 구한 roi의 히스토그램을 역투영시킴
cv2.imshow('dst',dst)

# 1-3) 동전을 이진화시키기 전에 조명에 의한 노이즈를 제거하기 위해 필터처리
disc = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) # 5x5사이즈 동그란 커널 가져와서
cv2.filter2D(dst, -1,disc, dst) # 필터처리 src, ddepth(-1해야 크기유지), kernel, dst=None, anchor=None, delta=None, borderType=None
cv2.imshow('filtered_dst',dst)

# 1-4) 영상 이진화, bitwise연산
_, thersh = cv2.threshold(dst, 35,255,0) # 트랙바로 찾은 제일 이진화가 잘된 값을 이용
thersh = cv2.merge((thersh,thersh,thersh)) # target은 3채널 영상이니까 mask도 3채널로 만들어줌
res = cv2.bitwise_and(target,thersh) # 마스크 부분에 대해서 bitwise and연산 한걸 res로 받아줌
result = np.vstack((target,thersh,res)) #이건 그냥 영상 세개를 이어붙이는 방법
cv2.imwrite('Program01.jpg',result)# 이건 과제물 저장용

# # 적절값 찾기 : 임계값이 몇일 때 가장 잘 나오는지 직접 확인하기 위해 트랙바 사용
# def on_trackbar(pos):
#     pos = cv2.getTrackbarPos('th','thresh') #트랙바이름, 윈도우이름
#     _, thersh = cv2.threshold(dst, pos,255,0,cv2.THRESH_BINARY)

#     cv2.imshow('thersh', thersh)

cv2.imshow('target',target)
cv2.imshow('hsv_roi',hsv_roi)
cv2.imshow('hist_tar',hist_tar)
cv2.imshow('thersh',thersh)
cv2.imshow('res',res)

# # cv2.namedWindow('thresh')
# # cv2.createTrackbar('th','thresh',0,255,on_trackbar)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

 

다음 코드의 결과다

위에 주석에 달아놓긴 했는데 실수로 ROI의 H , V영역의 히스토그램을 뽑아서 Target의 H ,S 영역에다 역투영 시켰는데 특정 색상에 대한 객체 검출이 너무너무너무 잘됐다

 

이걸 원래대로 ROI의 H, S영역을  뽑아서 target의 H, S영역에다 역투영시키면

개판이다 ㅋㅋㅋㅋㅋ 우측 상단 res가  결과물인데 별의 별 색을 다 뽑아낸다 실수가 만들어낸 역작인듯 나중에 알아보고 누가 이걸로 논문 안썼으면 내가써야지

 


# Task2 : Descrete Fourier Transform
# 1-1)마름모 이미지 생성
img = np.zeros((600,600),np.uint8)
img[150:450, 150:450]=255
rot = cv2.getRotationMatrix2D((300,300),45,1)
rotated_img = cv2.warpAffine(img, rot,(0,0))

# 1-2) 마름모 DFT
# np.fft.fft2(영상,--->이부분은 안씀 잘 s=None, axes=( -2, -1), norm=None)
f1 = np.fft.fft2(rotated_img) 
print(f1)
# np.fft.fftshift(f1, axes=None) 이거는  중심점을 가운데로 옮겨주는 메소드
fshift1 = np.fft.fftshift(f1)
magnitude_spectrum1 = 20*np.log(np.abs(fshift1)) #20log(|값|) 으로 해서 dB 뽑아줌 

# 2-1) 원 이미지 생성
cir = img.copy() *0
cv2.circle(cir, (300, 300), 10, 255, -1, cv2.LINE_AA)

# 2_2)원 DFT
f2 = np.fft.fft2(cir)
fshift2 = np.fft.fftshift(f2)
magnitude_spectrum2 = 20*np.log(np.abs(fshift2))

# 3) 작성
plt.subplot(221), plt.imshow(rotated_img, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(magnitude_spectrum1, cmap='gray')
plt.title('Magnitude_Spectrum_RECT'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(cir, cmap='gray')
plt.title('Input Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(magnitude_spectrum2, cmap='gray')
plt.title('Magnitude_Spectrum_CIR'), plt.xticks([]), plt.yticks([])
plt.show()

푸리에변환은 수학이 약해서 잘 모르지만 시간영역을 주파수영역으로 바꾸는 선형변환으로 알고있는데 

영상처리에 이렇게 쓰일줄은 상상도 못했다 덜덜덜덜 나중에 필요하면 다시 공부해봐야겠다

728x90

+ Recent posts