오픈소스의 컴퓨터비전 라이브러리인 OpenCV를 활용해 CNN 실습 진행
실습1. 이미지 조각 순서 변경
전
import cv2
def solve_puzzle(img, piece_order):
for idx, num in enumerate(piece_order):
if idx == num:
continue
piece_idx = piece_order.index(idx)
piece_order[idx] = piece_order[piece_idx]
piece_order[piece_idx] = num
r, c = img.shape[0] // 2, img.shape[1] // 2
p1_0, p1_1 = map(lambda x: x*r, divmod(num, 2))
p2_0, p2_1 = map(lambda x: x*r, divmod(idx, 2))
tmp = img[p1_0:p1_0 + r , p1_1: p1_1 + c].copy()
img[p1_0:p1_0 + r, p1_1:p1_1 + c] = img[p2_0:p2_0 + r, p2_1:p2_1 + c]
img[p2_0:p2_0 + r, p2_1:p2_1 + c] = tmp
return img
if __name__ == "__main__":
piece_order = [3, 2, 1, 0]
img = cv2.imread("./puzzle.jpg", cv2.IMREAD_GRAYSCALE)
result_img = solve_puzzle(img, piece_order)
cv2.imwrite('result.jpg', result_img)
- p1과 p2 각각에 4등분한 좌표 입력
- img.shape -> (225, 225)
- idx:0, num:3 일때 -> p1_0: 112, p1_1: 112, p2_0: 0, p2_1: 0
- idx:1, num:2 일때 -> p1_0: 112, p1_1:0, p2_0: 0, p2_1: 112
- 실행 중간에 값이 변경되기 때문에 tmp라는 변수에 복사 진행
후
실습2. 프리윗 필터
전
import numpy
import cv2
def prewitt(img):
vkernel = numpy.array([
[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1]
])
hkernel = numpy.array([
[-1, -1, -1],
[0, 0, 0],
[1, 1, 1]
])
# 수직 프리윗 필터
dst_vertical_edge = cv2.filter2D(img, -1, vkernel)
# 수평 프리윗 필터
dst_horizontal_edge = cv2.filter2D(img, -1, hkernel)
# 수직/수평 프리윗 필터를 적용시킨 두 이미지의 합
return dst_vertical_edge + dst_horizontal_edge
if __name__ == "__main__":
img = cv2.imread("elice.png", cv2.IMREAD_GRAYSCALE)
filtered_img = prewitt(img)
cv2.imwrite("result.jpg", filtered_img)
후
실습3. 회선처리
- 이웃한 화소 갑과 대응하는 회선 마스크의 가중치를 곱해서 곱한 값을 더함
- 경계선은 회선처리가 어렵기 때문에, 경계선을 제외한 내부 화소만 회선처리 진행
전
import numpy
import cv2
def convolution2D(img, kernel):
dst = img.copy()
center_r = kernel.shape[0] // 2
center_c = kernel.shape[1] // 2
# 실제 원본 이미지에서의 행렬 좌표 ( 목적 영상 좌표 )
for i in range(center_r, img.shape[0] - center_r): # 내부 화소에서 시작해서 내부 화소 끝까지
for j in range(center_c, img.shape[1] - center_c):
I = 0
for r in range(kernel.shape[0]):
for c in range(kernel.shape[1]):
# 중심점 기준으로 좌표 이동
x = i + r - center_r
y = j + c - center_c
I += (img[x, y] * kernel[r, c])
dst[i, j] = I
return dst
def prewitt(img):
vertical_kernel = numpy.array(
[
[ -1, 0, 1],
[ -1, 0, 1],
[-1, 0, 1]
]
)
horizontal_kernel = numpy.array(
[
[ -1, -1, -1],
[ 0, 0, 0],
[1, 1, 1]
]
)
# 프리윗 필터에 회선처리 적용
dst_vertical_edge = convolution2D(img, vertical_kernel)
dst_horizontal_edge = convolution2D(img, horizontal_kernel)
return dst_vertical_edge + dst_horizontal_edge
if __name__ == "__main__":
img = cv2.imread("elice.png", cv2.IMREAD_GRAYSCALE)
filtered_img = prewitt(img)
cv2.imwrite("result.jpg", filtered_img)
후
반응형
'IT Study > ML & DL' 카테고리의 다른 글
[RNN] RNN, LSTM, GRU 모델 (1) | 2023.12.31 |
---|---|
[DL/NLP] RNN 실습 (with. nsmc data) (1) | 2023.12.23 |
[DL/NLP] Word2Vec - CBOW & Skip-Gram 방식 (1) | 2023.12.23 |
[DL/CNN] CNN 실습 (with. MNIST data) (0) | 2023.12.22 |