컴퓨터/Python

[Python] Opencv 이미지 영역 설정 후, 수정본 덮어쓰기 (영역합성)

sjblog 2022. 9. 5. 03:05
반응형

파이썬 Opencv를 이용하여 이미지의 특정 영역을 수정하고 원본 이미지에 덮어쓰기를 해보겠습니다.

 

 

 

<완성본>

 

 

1. 패키지 설치

import cv2
import matplotlib.pyplot as plt
import numpy as np

pip install opencv-python

2. 이미지 불러오기

# 이미지 열기
img = cv2.imread('1.png')
img_change = cv2.imread('1.png')

이미지 1.png를 불러옵니다.

 

 

img, img_change 두개로 나눈 이유는

 

img_change에 수정한 이미지를 덮어쓰기 위함입니다. (영역 합성)

 

3. 마우스로 수정할 영역 설정

# 마우스로 영역 설정
x,y,w,h	= cv2.selectROI('img', img, False)

# 이미지가 클 경우
#x,y,w,h = 500,1500,1000,1000

cv2.waitKey(0)
cv2.destroyAllWindows()

이미지 사이즈가 커서 모니터를 벗어나, 마우스로 영역을 설정할 수 없는 상황이라면

 

주석처리된 부분에 직접 영역을 설정해주세요!

 

 

4. 이미지 수정

사용하고자 하는 이미지 처리를 넣어주세요!

 

아래 코드는 히스토그램 평활화, 대비조절, 밝기조절, 감마보정을 예시로 넣었습니다.

 

def histogram_equ(img):
    img_1 = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
    # Y채널 평활화
    img_1[:,:,0] = cv2.equalizeHist(img_1[:,:,0])
    # YUV를 RGB로
    img_output = cv2.cvtColor(img_1, cv2.COLOR_YUV2BGR)
    
    return img_output

def contrast(img):
    img_1 = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
    l, a, b = cv2.split(img_1)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
    l = clahe.apply(l)
    img_1 = cv2.merge((l, a, b))
    img_output = cv2.cvtColor(img_1, cv2.COLOR_LAB2BGR)

    return img_output

def brightness_up(img, val):
    val = np.full(img.shape, ([val, val, val]), dtype=np.uint8)
    img_output = cv2.add(img, val)

    return img_output

def brightness_down(img, val):
    val = np.full(img.shape, ([val, val, val]), dtype=np.uint8)
    img_output = cv2.subtract(img, val)

    return img_output

def gamma(img):
    gamma = 0.6
    lut = np.zeros((256,1),dtype = 'uint8')
    for i in range(256):  lut[i][0] = 255 * (float(i)/255) ** (gamma)
    img_output = cv2.LUT(img, lut)
    
    return img_output

img_histo = histogram_equ(img)
img_contrast = contrast(img_histo)
img_bright_up = brightness_up(img_contrast, 50)
#img_bright_down = brightness_down(img_bright_up, 50)
img_gamma = gamma(img_bright_up)

 

 

5. 수정 이미지 덮어쓰기 (영역 합성)

roi = img_gamma[y:y+h, x:x+w]
img_change[y:y+h, x:x+w] = roi

마지막 수정 이미지인 img_gamma에,

 

마우스로 설정한 영역의 이미지만큼 잘라내어 roi 이미지로 저장합니다.

 

또한, 이러한 roi 이미지를 원본 이미지인 img_change에 설정한 영역에 합성합니다.

 

 

6. 결과 확인

# Matplot 한글깨짐 처리
plt.rc('font', family='Malgun Gothic')
plt.rcParams['axes.unicode_minus'] = False #한글 폰트 사용시 마이너스 폰트 깨짐 해결

# 보기
plt.subplot(1,2,1)
plt.imshow(img[:,:,::-1])
plt.title('원본')
plt.xticks([])
plt.yticks([])

plt.subplot(1,2,2)
plt.imshow(img_change[:,:,::-1])
plt.title('수정본')
plt.xticks([])
plt.yticks([])

plt.tight_layout()
plt.show()


# 저장
cv2.imwrite('2.png', img_change)

 

반응형