OpenCV - 3 (gamma,affine,filtering)

Jaho·2021년 12월 19일
0

Python

목록 보기
15/18
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()

이미지 처리 회선 방법 = 이미지필터링(Filtering)

샤프닝(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
5
5 = 25/1

2) 가우시안 필터 : 유클리드안 거리를 해결하기 위해 사용

3) 통계 필터 : 중간 값 필터, median 이라고 알려진다. [비선형 랜덤 잡음] 이미지 _사진의 잡음

4) 몽롱화 현상 : 세밀한 부분을 제거하거나 곡선의 잡음 틈들을 연결하는 효과를 지닌다.


profile
개발 옹알이 부터

0개의 댓글