공부하는 아저씨의 IT 공방

파이썬 시각화 공부 8일(원본 이미지, 스케일 변환 이미지 비교) 본문

파이썬 기초(1일 1코드)

파이썬 시각화 공부 8일(원본 이미지, 스케일 변환 이미지 비교)

공대아저씨 2023. 9. 15. 21:23

안녕하세요 ㅎ 공대아저씨 입니다.

 

오늘은 파이썬 시각화 공부 8일차! 원본이미지와 원본이미지를 갖고 스케일 변환을 한 이미지를 

 

지난 시간에 배운 히스토그램(histogram)을 활용해서 비교하는 실습을 진행해 보겠습니다.

 

먼저 실습을 위한 이미지를 다운받으시기 바랍니다.

 

night.jpg
4.07MB
night2.jpg
0.04MB
night3.jpg
0.13MB

 

먼저 이미지를 불러와 보겠습니다.

 

import cv2
from matplotlib import pyplot as plt

img0 = cv2.imread('./img/night.jpg', cv2.IMREAD_GRAYSCALE)

plt.imshow(img0)

이미지 출력결과

 

 

원본 'night' 이미지를 grayscale로 변환하여  띄워보니 이런 느낌이네요

 

아래에 있는 실제 이미지와는 차이가 있습니다. 약간 이미지가 푸른? 색이 된거같은 느낌입니다.

 

오늘은 이렇게 파란색으로 편향적인 결과가 나온 이미지를 보다 균등한 색분포의 이미지로 변환하는 작업인

 

equalization을 거친 후 과연 어떤 histogram 차이가 있는지 비교해 보겠습니다.

 

# 한페이지에 이미 + 히스토 그램 나오게 하기

import cv2
from matplotlib import pyplot as plt

img0 = cv2.imread('./img/night.jpg', cv2.IMREAD_GRAYSCALE)
img1 = cv2.equalizeHist(img0)

plt.figure(figsize=(15,10))

plt.subplot(2,2,1)
plt.imshow(img0)

plt.subplot(2,2,2)
plt.imshow(img1)

plt.subplot(2,2,3)
plt.hist(img0.ravel(), 128, [0,256])
plt.xlim([0,256])

plt.subplot(2,2,4)
plt.hist(img1.ravel(), 128, [0,256])
plt.xlim([0,256])

plt.show()
cv2.destroyAllWindows()

img0 이미지는 기존의 이미지를 grayscale로 변환한 것이고,

img1은 img0 이미지를 equalize 시킨 것입니다.

 

한번 어떻게 변하는지 비교해보겠습니다.

 

이미지 출력결과 grayscale(좌) equalize(우)

 

적용된 결과를 보니 확실히 grayscale는 히스토그램 수치들 자체가 왼쪽으로 치우쳐져 있는 형태로 보입니다.

그러나 오른쪽에 equalize된 이미지는 이전 이미지보다 좀더 색의 분포가 넓어진것 같은 느낌입니다.

 

그러다보니, 원래 이미지에 보이지 않았던, 구름의 형태도 나타나고 실제 이미지보다 훨씬 물체들의 윤곽이

선명해진 느낌입니다.

 

같은 방법으로 night2 이미지를 갖고 실습을 해보겠습니다.

 

원본이미지(night2)

원본이미지를 보면 확실히 도로의 일부와 건물의 윤곽 일부만 보이는데,

이것을 grayscale과 equalize를 통해서 이미지 변환 후 hist값을 비교해 보도록 하겠습니다.

 

# 한페이지에 이미 + 히스토 그램 나오게 하기

import cv2
from matplotlib import pyplot as plt

img0 = cv2.imread('./img/night2.jpg', cv2.IMREAD_GRAYSCALE)
img1 = cv2.equalizeHist(img0)

plt.figure(figsize=(15,10))

plt.subplot(2,2,1)
plt.imshow(img0)

plt.subplot(2,2,2)
plt.imshow(img1)

plt.subplot(2,2,3)
plt.hist(img0.ravel(), 128, [0,256])
plt.xlim([0,256])

plt.subplot(2,2,4)
plt.hist(img1.ravel(), 128, [0,256])
plt.xlim([0,256])

plt.show()
cv2.destroyAllWindows()

이미지 출력결과 grayscale(좌) equalize(우)

 

확실히 grayscale을 통해서 보니 이미지 자체가 굉장히 편향된 색들의 조합으로 이루어 진 것을 볼 수있습니다.

그러나 equalize를 하면 보이지 않았던 건물의 윤곽이나 여러가지 형체들이 좀더 선명해진 것을 볼 수있습니다.

 

이렇게 간단한 코드로 이미지를 여러 형태로 시각화 시킬 수있습니다.

 

자, 오늘은 이렇게 이미지를 변환하고 원래 이미지와 어떤 분포 차이를 갖는지 한번 알아보았습니다.

 

다음시간에는 binarization인 영상의 이진화 방법에 대해서 한번 알아보도록 하겠습니다. 감사합니다.:)