import cv2
#상수정의
o_w_n = 'org' ; g_w_n='gray'; c_w_n='canny'
o_f_n='c:\\myimg\\OIP.jpg'; g_f_n= 'c:\\myimg\\OIPG.jpg'; c_f_n='c:\\myimg\\OIPC.jpg';
#원본 이미지 로드
org_img =cv2.imread(o_f_n,cv2.IMREAD_UNCHANGED) # IMREAD_UNCHANGED 원본
#그레이 스케일로 변환하면서 로드
gray_img = cv2.imread(o_f_n,cv2.IMREAD_GRAYSCALE) #IMREAD_GRAYSCALE 흑백(그레이)
canny_img = cv2.Canny(gray_img,50,100) #엣지(가장자리) 추출
#프레임 창에 표시 (프레임 제목)
cv2.namedWindow(o_w_n); cv2.namedWindow(g_w_n); cv2.namedWindow(c_w_n)
#제목과 추출 이미지 표시
cv2.imshow(o_w_n,org_img) #(파일이름, 대상)
cv2.imshow(g_w_n, gray_img)
cv2.imshow(c_w_n, canny_img)
#파일에 저장
cv2.imwrite(g_f_n, gray_img)
cv2.imwrite(c_f_n, canny_img)
#종료
cv2.waitKey(0) #무한기다림
cv2.destroyAllWindows()
# https://ko.wikipedia.org/wiki/YCbCr
# y = 255 * (x/255)^ (1/r) r의 값이 1보다 크면 밝다 / 1보다 작으면 어둡다
# LUT (src, lut[,dst]) -> dst
import cv2
import numpy as np
# 감마 테이블을 만들어 이미지를 적용 해보자
r = 1.8
lookup_table = np.zeros((256,1), dtype='uint8')
for i in range(256):
lookup_table[i][0]= 255 * pow(float(i)/255, 1.0/r)
o_f_n = 'c:\\myimg\\road.jpg'
#파일 읽어서 감마처리 후 파일 저장
img_src = cv2.imread(o_f_n,1)
img_gamma = cv2.LUT(img_src, lookup_table)
cv2.imwrite('c:\\myimg\\road_gamma.jpg',img_gamma)
road.jpg 원본이미지
road_gamma.jpg 감마처리된 이미지
# YcbCr(YCC) cv2.COLOR_BGR2YCR_CB
import cv2
import numpy as np
import pylab as plt
#이미지 로드
o_img = cv2.imread('c:\\myimg\\road.jpg',1)
lut_img = cv2.imread('c:\\myimg\\road_gamma.jpg',1)
# 1.이미지를 YCC로 변환
o_ycc = cv2.cvtColor(o_img, cv2.COLOR_BGR2YCR_CB)
lut_ycc = cv2.cvtColor(lut_img, cv2.COLOR_BGR2YCR_CB)
#calcHist(images, channels, mask,histSize, ranges)
#2.히스토그램 Cb,Cr 값 비교
# h_o = cv2.calcHist([o_ycc],[2], None,[256],[0,256])
# h_lut = cv2.calcHist([lut_ycc],[2], None,[256],[0,256])
plt.plot(h_o)
plt.plot(h_lut)
plt.xlim([0,256])
plt.show()
#3.channels의 밝기 Y를 지정하고 마스크 없이 크기를 256으로 범위를 지정해서 확인 해보자
h_o = cv2.calcHist([o_ycc],[0], None,[256],[0,256])
h_lut = cv2.calcHist([lut_ycc],[0], None,[256],[0,256])
#3-1.channels의 밝기 1를 지정하고 마스크 없이 크기를 256으로 범위를 지정해서 확인 해보자
h_o = cv2.calcHist([o_ycc],[1], None,[256],[0,256])
h_lut = cv2.calcHist([lut_ycc],[1], None,[256],[0,256])
#3-2.channels의 밝기 2를 지정하고 마스크 없이 크기를 256으로 범위를 지정해서 확인 해보자
h_o = cv2.calcHist([o_ycc],[2], None,[256],[0,256])
h_lut = cv2.calcHist([lut_ycc],[2], None,[256],[0,256])
1.아핀변환(2*3) : affine transformation 평행 사변형으로 변환
1) 평행이동, 회전 = Euclidean space
2) 평행이동, 회전 + 확대 , 축소 = similarity transformation
2.투영 변환(3*3) : projective transformation 사각형으로 변환 (보정작업)
1) 투시 변환 perspective transformation
2) 호모 그래피 변환(평면 투영 변환) homography transformation
cv2. getRotationMatrix2D(center, angle, scale) -> retval
cv2. wrapAffine(src, M, dsize[,dst[,flags,[,borderMode[,borderValue]]]])
flags
cv2.INTER_NEAREST
cv2.INTER_LINEAR
cv2.INTER_CUBIC
cv2.INTER_LANCZOS4
borderMode
cv2.BORDER_CONSTANT
cv2.BORDER_REPLICATE
cv2.BORDER_REFLECT
cv2.BORDER_WRAP
cv2.BORDER_REFLECT_101
cv2.BORDER_TRANSPARENT
import cv2
import numpy as np
import math
img = cv2.imread('c:\\myimg\\gujji.jpg')
h,w,c = img.shape
print(h,w,c)
mat = cv2.getRotationMatrix2D((w/2,h/2), 45, 0.5)
print(mat)
dst= img//4
affine_img = cv2.warpAffine(img,mat,(w,h),borderValue=(0,128,255)) #BGR
cv2.imshow('test',affine_img)
affine_img = cv2.warpAffine(img,mat,(w,h),borderMode=cv2.BORDER_TRANSPARENT, dst = dst)
cv2.imshow('res',affine_img)
affine_img = cv2.warpAffine(img,mat,(w,h),borderMode = cv2.BORDER_REPLICATE)
cv2.imshow('res01',affine_img)
affine_img = cv2.warpAffine(img,mat,(w,h),borderMode = cv2.BORDER_WRAP)
cv2.imshow('res02',affine_img)
cv2.waitKey()
cv2.destroyAllWindows()
여러구도로 나오는걸 확인해보자.
#np.float32() -> 평행 이동만
img = cv2.imread('c:\\myimg\\gujji.jpg')
h,w= img.shape[:2]
dx, dy = 30,30
mat = np.float32([[1,0,dx],
[0,1,dy]] )
affine_img = cv2.warpAffine(img,mat,(w,h))
cv2.imshow('res', affine_img)
cv2.waitKey()
cv2.destroyAllWindows()
샤프닝(Sharpening)
또는 크리스프닝(Crispening)
을 말하며 영상내의 엣지 부분을 강조하여 영상을 더욱 선명한 느낌으로 만들어 주는 영상기법
[내부적 연산]
- 주변의 정보를 사용해서 대상의 화소값을 업데이트 하는 것으로 필터가 이미지의 각 픽셀을 순회하면서
해당 픽셀들과 곱해져 더해진다. ( * +)
- 필터 후 (화소값) x (필터) 로 연산한다.
[필터의 종류]
1.하이패스 필터 : 방향의 관계 없이 엣지를 추출
2.그라디언트 필터 : 1차 미분 필터로 한 방향의 엣지를 추출 _ 커널을 회전하는 방법으로 상하방향, 좌우방향을 지정해서
어느 방향으로 엣지를 추출할 것인지를 지정할 수 있다.
3.라플리시안 필터 : 2차 미분 필터로 평면의 모든 방향 엣지를 추출한다.
4.가우시안 필터 : 노이즈 제거에 사용
cv.filter2D( src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]] ) -> dst
filter2D (src 입력대상 ,dst 출력대상 ,ddepth 출력이미지 깊이 ,kernel 회선커널)
회선커널 : height와 weight를 설정해서 해당 구역의 평균
#1 필터 연산을 구현해보자. 주변 정보에서 화소 값을 계산하고 노이즈를 계산한다.
import cv2
import numpy as np
kernel = np.ones((3,3)) /9.0 #회선에 사용하는 필터
img = cv2.imread('c:\\myimg\\letters.jpg',0) # 흑백 이미지 로드
img_kel = cv2.filter2D(img, -1, kernel) # 인수 '-1'은 원본 이미지 (img)를 돌려주는 것을 의미
#라플라시안 필터 (3*3)
kernel_laplacian_3X3 = np.array ([ [1,1,1],
[1,-8,1],
[1,1,1]
], np.float32)
img_kel_laplacian = cv2.filter2D(img, -1, kernel_laplacian_3X3) #기울기 , 모서리 감지
#라플라시안 필터 (3*3)
kernel_laplacian_3X3_02 = np.array ([ [-1,-1,-1],
[-1,9,-1],
[-1,-1,-1]
], np.float32)
img_kel_laplacian02 = cv2.filter2D(img, -1, kernel_laplacian_3X3_02) #기울기 , 모서리 감지
#gaussian
kernel_gaussian = np.array ([ [1,2,1],
[2,4,2],
[1,2,1]
], np.float32) /16
img_kel_gaussian = cv2.filter2D(img, -1, kernel_gaussian) #기울기 , 모서리 감지
print(kernel_gaussian)
#이미지 보기
cv2.imshow('img_kel',img_kel)
cv2.imshow('laplacian',img_kel_laplacian)
cv2.imshow('laplacian02',img_kel_laplacian02)
cv2.imshow('gaussian',img_kel_gaussian)
#종료
cv2.waitKey(0) #무한기다림
cv2.destroyAllWindows()
img_kel
laplacian
laplacian02
gaussian
필터처리과정 영상내에서 점으로 마스크 움직임으로 이루어지고 감지한다.
주파수에서 신호처리를 하기 위해서 푸리에 변환(푸리에 급수(숫자들의 나열된 합)에 근원을 가진다.
푸리에 : 같은 형태의 반복하는 파동은 단순 파동의 결합이다.
영상의 화소에 직접적으로 수행되는 필터처리를 구현해야 하며 공간필터라는 용어를 사용한다.
평활화 공간여파기 _ 히스토그램 평활화 / 평활화(평탄화) 필터 -> 영상을 흐리게 해서 잡음을 감소 시킨다.
1) 평균처리 필터 : 마스크 필터내의 명암도(값)의 평균으로 명암값을 대처한다.
33 = 9/1
55 = 25/1
2) 가우시안 필터 : 유클리드안 거리를 해결하기 위해 사용
3) 통계 필터 : 중간 값 필터, median 이라고 알려진다. [비선형 랜덤 잡음] 이미지 _사진의 잡음
4) 몽롱화 현상 : 세밀한 부분을 제거하거나 곡선의 잡음 틈들을 연결하는 효과를 지닌다.