IT Study/ML & DL

[CNN] OpenCV 실습 | 이미지 조각 순서변경, 프리윗 필터, 회선처리

짹짹체유 2023. 12. 31. 13:08

 

오픈소스의 컴퓨터비전 라이브러리인 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