반응형
파이썬 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)
반응형
'컴퓨터 > Python' 카테고리의 다른 글
[Python] 파이썬, 캔들차트 matplotlib로 직접 그리기 (0) | 2022.09.21 |
---|---|
[Python] 파이썬, 엑셀 파일을 읽고 쓰기 (pandas) (0) | 2022.09.09 |
[Python] 파이썬, 터미널 출력 문자에 색상 지정하기 (0) | 2022.08.21 |
[Python] 파이썬, PDF 파일을 이미지로 변환 (pdf2image) (0) | 2022.05.30 |
[Python] 파이썬, 공휴일 조회하여 출력하기 (공공데이터포털) (0) | 2022.05.05 |