퐈니썬's LIfe - 잘 실패하자 RSS 태그 관리 글쓰기 방명록
이미지처리 (3)
2022-01-21 00:19:05
728x90
반응형

<Introduction>

입력 이미지를 "상하좌우 대칭 변환 (Image Flip)"을 구현해 보고자 합니다.

opencv 라이브러리를 통해 간단하게 진행이 가능하지만, 전반적인 이미지 처리에 대한 이해를 다지고자 작성하였습니다. 

 

<Flip>

이미지 대칭 변환(Flip)은 2차원에서는 width 방향, height 방향에 대하여 반전이 가능합니다.

입력 이미지의 크기와 이미지 대칭 변환을 한 출력 이미지의 크기는 동일합니다. 

 

입력 이미지의 크기가 (w, h)일때, 입력 이미지 위의 좌표 (x, y)는 다음과 같은 수식의 형태로 결과 이미지에서 좌표 (x', y')에 매핑합니다. 

 

[상하 대칭 변환]

$$  x' = x $$

$$  y' = h -1 -y $$

 

[좌우 대칭 변환]

$$  x' = w -1 -x $$

$$  y' = y $$

 

<구현>

import cv2
import numpy as np
#Load image
img = cv2.imread('./../Image02.png')
height, width = img.shape[0], img.shape[1]
#Flip
output = np.zeros((height, width,3), dtype=np.uint8)

for x in range(height):
    for y in range(width):
        xp = height - x - 1       #상하 반전
        yp = width - y - 1        #좌우 반전
        output[x,y] = img[xp, y] #상하 반전
        # output[x, y] = img[x, yp] #좌우 반전

cv2.imwrite('./flip_implement.png', output)

 

 

728x90
반응형
2022-01-18 15:12:15
728x90
반응형

<Introduction>

입력 이미지를 특정 위치의 bounding box로 cropping (잘라내기) 하는 과정을 python으로 직접 구현하고자합니다. 

opencv 라이브러리를 통해 간단하게 진행이 가능하지만, 전반적인 이미지 처리에 대한 이해를 다지고자 작성하였습니다. 

 

 

<Cropping>

Cropping은 입력 이미지의 특정 부분을 잘라내어 하나의 이미지로 생성하는 과정입니다. 

특정 부분은 Bounding box 형태로 4 개의 좌표가 주어져야 합니다. 

 

start X, Y와 end X, Y 가 주어졌다고 가정했을때, Cropping 되는 이미지의 사이즈는 Bounding box의 사이즈와 동일하게 출력되어야 합니다.

 

출력 이미지 size = (end[X] - start[X], end[Y] - start[Y])

 

우리가 출력하고자하는 start X, Y와 end X, Y를 꼭지점으로 하는 bounding box는 입력 이미지의 좌표가 됩니다. 

 

즉, 입력 이미지의 start X ~ end X 좌표와 start Y ~ end Y 좌표에 픽셀 값을 출력 이미지의 x, y 좌표에 하나씩 입력해주는 과정을 거치면 됩니다. 

 

<입력 이미지>

 

<구현>

import  cv2
import  numpy as np
#Load image
img = cv2.imread('Image01.png')
print(img.shape, img.dtype)

#Cropped data
start = (200, 100)
end = (320, 230)
output = np.zeros((end[0]-start[0], end[1]-start[1], 3), np.uint8)
print(output.shape)
for y in range(output.shape[1]):
    for x in range(output.shape[0]):
        xp, yp = x + start[0], y+start[1]
        output[x,y] = img[xp,yp]
# save result
print(output.shape)
cv2.imwrite('./cropped image02.png',output)

 

 

<opencv>

import cv2
#Load image
img = cv2.imread('./Image01.png')
cv2.imshow('original', img)

#Cropped data
start = (200, 100)
end = (320, 230)
output = img[start[0]:end[0], start[1]:end[1]]
cv2.imwrite('./cropped image03.png',output)

 

728x90
반응형
2022-01-17 21:58:35
728x90
반응형

<Introduction>

입력 이미지를 그레이 스케일 이미지로 변환하는 내용을 python으로 직접 구현하고자 합니다. 

opencv 라이브러리를 통해 간단하게 진행이 가능하지만, 전반적인 이미지 처리에 대한 이해를 다지고자 작성하였습니다. 

 

 

 

<RGB -> Grayscale>

입력 이미지는 RGB로 구성된 이미지를 적용할 것입니다.

RGB로 구성된 이미지를 Grayscale로 바꾸기 위해서는 색상 채널을 변경해야 합니다.

즉, N x N x 3 으로 구성된 이미지를 N x N x 1로 표현해야 할 것입니다.

 

그러기 위해서는 한 픽셀에 대해 가지고 있는 RGB 색상을 평균하여 하나의 값으로 만들어 주어 다시 값을 입력하면 됩니다. 

 

 

<구현>

import numpy as np
import cv2

#load image
img = cv2.imread('./Image01.png')
print(f"image shape: {img.shape} \n data type: {img.dtype}\n")
#view image
cv2.imshow('original image',img)
cv2.waitKey(0)
#get original image attribute
height = img.shape[0]
width = img.shape[1]
#create target array for gray scale
gray_image = np.zeros((height, width, 1), dtype=np.uint8)

print("converting...\n")

# 입력 이미지의 pixel 값 하나씩 불러서 변경
for h in range(height):
    for w in range(width):
        b = img[h, w, 0].astype(np.float32) # RGB의 Blue 값 입력받기
        g = img[h, w, 1].astype(np.float32) # RGB의 Green 값 입력받기
        r = img[h, w, 2].astype(np.float32) # RGB의 Red 값 입력받기

        intensity = (b+g+r)/3               # RGB 채널의 값을 하나의 값으로 평균 내기
        gray_image[h, w, 0] = intensity     # target array에 값 저장
        
print("done")
cv2.imshow("converted grayimage", gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

 

<결과>

<입력 이미지>

 

 

<출력 이미지>

 

728x90
반응형