딥러닝

딥러닝 - OpenCV_011_히스토그램_주파수영역처리

인생진리 2023. 3. 9. 12:32

[11차시] 학습목표
○ 히스토그램에 대해 학습하고 이미지의 히스토그램을 표시해 본다

○ 주파수의 개념에 대해 학습한다

○ 주파수 기반 처리 방법에 대해 학습한다

1  히스토그램 (histogram)

1.1  개념

  • 히스토그램 (Histogram) : 이미지의 색상 별로 픽셀의 개수를 그래프로 표시한 것
  • Numpy, Matplotlib 라이브러리에서 함수를 제공하지만 OpenCV에서 제공하는 calcHist() 함수가 가장 성능이 좋음

1.2  gray 이미지의 히스토그램

  • calcHist([이미지], [채널], 특정 부분 마스크, [색상 개수], [픽셀값의 범위])
    • 채널은 흑백영상인 경우는 0, 칼라영상인 경우는 R(0), G(1), B(2)
#실습
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./images/histogram.png", cv2.IMREAD_GRAYSCALE)
plt.imshow(img, cmap = "gray")
plt.axis("off")
plt.show()

hist = cv2.calcHist([img],[0],None, [256],[0,255])

plt.plot(hist)
plt.xlim([0,255])

이 코드는 이미지에서 히스토그램을 계산하여 그래프로 출력하는 코드입니다.

 

코드의 전반적으로 가독성이 좋고, 변수명과 주석도 명확하게 표기되어 있습니다.

그러나, 코드에서는 이미지 파일 경로를 직접 지정하고 있으므로,

코드가 실행되기 위해서는 해당 이미지 파일이 존재하는 경로를 정확히 지정해주어야 합니다.

 

또한, 히스토그램을 계산할 때 bin 개수를 256으로 고정하고 있습니다.

만약 이미지의 픽셀 값이 256 이하가 아닌 경우, 히스토그램 계산이 정확하지 않을 수 있으므로,

bin 개수를 조정해주어야 합니다. 예를 들어, 0~100 범위의 이미지에서는

100으로 bin 개수를 지정하는 것이 더 적절합니다.

 

마지막으로, 그래프 출력시 x, y 축 레이블과 그래프 제목을 추가하여 보완하는 것이 좋습니다.

개선점으로는 이미지 파일 경로를 변수로 지정하거나, argparse 라이브러리를 이용하여

커맨드 라인에서 파일 경로를 입력받아 코드를 실행할 수 있도록 하는 것이 좋을 것입니다.

또한, bin 개수를 조정하고, 그래프 출력을 보완하여 코드를 더욱 완성도 있게 만드는 것이 좋을 것입니다.

1.3  칼라 이미지의 히스토그램

#실습
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./images/back1.PNG")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)


plt.imshow(img, cmap = "gray")
plt.axis("off")
plt.show()

redHist = cv2.calcHist([img],[0],None, [256], [0,255])
greenHist = cv2.calcHist([img],[1],None, [256], [0,255])
blueHist = cv2.calcHist([img],[2],None, [256], [0,255])

plt.plot(redHist, c = "r")
plt.plot(greenHist, c = "g")
plt.plot(blueHist, c = "b")

이 코드는 컬러 이미지에서 각 채널(RGB)별 히스토그램을 계산하여 그래프로 출력하는 코드입니다.

 

코드의 전반적으로 가독성이 좋고, 변수명과 주석도 명확하게 표기되어 있습니다.

그러나, 코드에서는 이미지 파일 경로를 직접 지정하고 있으므로,

코드가 실행되기 위해서는 해당 이미지 파일이 존재하는 경로를 정확히 지정해주어야 합니다.

 

또한, 각 채널(RGB)별 히스토그램을 계산할 때 bin 개수를 256으로 고정하고 있습니다.

만약 이미지의 픽셀 값이 256 이하가 아닌 경우, 히스토그램 계산이 정확하지 않을 수 있으므로, bin 개수를 조정해주어야 합니다. 예를 들어, 0~100 범위의 이미지에서는 100으로 bin 개수를 지정하는 것이 더 적절합니다.

 

마지막으로, 그래프 출력시 x, y 축 레이블과 그래프 제목을 추가하여 보완하는 것이 좋습니다.

 

개선점으로는 이미지 파일 경로를 변수로 지정하거나, argparse 라이브러리를 이용하여

커맨드 라인에서 파일 경로를 입력받아 코드를 실행할 수 있도록 하는 것이 좋을 것입니다.

또한, bin 개수를 조정하고, 그래프 출력을 보완하여 코드를 더욱 완성도 있게 만드는 것이 좋을 것입니다.

 

1.4  히스토그램 균일화

  • 색상 분포를 균일하게 변경하여 이미지의 콘트라스트를 강조하는 방법
  • cv2.equalizeHist(img) : 히스토그램 균일화 함수
  • 콘트라스트가 너무 강조된 경향이 있으므로 cv2.createCLAHE() 함수를 적용하면 더 나은 결과가 가능함.
#실습
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("images/histogram.png", cv2.IMREAD_GRAYSCALE)

plt.imshow(img, cmap='gray')
plt.axis("off")
plt.show()

eq_img = cv2.equalizeHist(img)

plt.imshow(eq_img, cmap='gray')
plt.axis("off")
plt.show()

hist = cv2.calcHist([eq_img],[0],None,[256],[0,255])

plt.plot(hist)

이 코드는 이미지에 대해 히스토그램 평활화(equalization)를 적용하여 이미지를 개선하고,

개선된 이미지의 히스토그램을 그래프로 출력하는 코드입니다.

 

코드의 전반적으로 가독성이 좋고, 변수명과 주석도 명확하게 표기되어 있습니다.

 

그러나, 코드에서는 이미지 파일 경로를 직접 지정하고 있으므로,

코드가 실행되기 위해서는 해당 이미지 파일이 존재하는 경로를 정확히 지정해주어야 합니다.

 

또한, 히스토그램 평활화를 적용할 때, 밝기 대비와 색상 대비가 향상되므로,

컬러 이미지에 대해서는 RGB 채널별로 각각 적용해주어야 합니다.

이 코드에서는 그레이스케일 이미지를 대상으로 히스토그램 평활화를 적용하고 있으므로,

컬러 이미지에 대해서는 별도의 처리가 필요합니다.

 

마지막으로, 개선된 이미지의 히스토그램 출력시 x, y 축 레이블과 그래프 제목을 추가하여 보완하는 것이 좋습니다.

개선점으로는 이미지 파일 경로를 변수로 지정하거나,

argparse 라이브러리를 이용하여 커맨드 라인에서 파일 경로를 입력받아 코

드를 실행할 수 있도록 하는 것이 좋을 것입니다. 또한,

컬러 이미지에 대해서는 RGB 채널별로 각각 히스토그램 평활화를 적용하도록 수정하고,

그래프 출력을 보완하여 코드를 더욱 완성도 있게 만드는 것이 좋을 것입니다.

 

1.5  2차원 히스토그램

  • 2개의 축(H, S)이 만나는 지점의 개수를 표현
#실습
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./images/back1.PNG")
img = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)


plt.imshow(img, cmap = "gray")
plt.axis("off")
plt.show()

hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)

# 색상과 채도 채널을 이용해서 히스토리그램을 표시
hist = cv2.calcHist([hsv],[0,1],None, [180, 255], [0,179, 0, 255])

plt.imshow(hist)
plt.xlabel("Saturation")
plt.ylabel("Hue (Color)")
plt.colorbar()

이 코드는 컬러 이미지를 불러온 후, HSV(Hue, Saturation, Value) 색상 공간으로 변환하여,

Hue와 Saturation 채널을 이용한 2D 히스토그램을 그래프로 출력하는 코드입니다.

 

코드의 전반적으로 가독성이 좋고, 변수명과 주석도 명확하게 표기되어 있습니다.

 

하지만, 코드에서는 그래프를 출력할 때, imshow() 함수를 이용하여 이미지처럼 출력하고 있으나,

2D 히스토그램은 이미지가 아니므로, 올바른 출력 방법이 아닐 수 있습니다.

 

따라서, matplotlib의 hist2d() 함수 등을 이용하여 2D 히스토그램을 적절하게 출력하는 것이 좋습니다.

 

그리고, 그래프 출력시 x, y 축 레이블과 그래프 제목을 추가하여 보완하는 것이 좋습니다.

개선점으로는 2D 히스토그램을 올바른 방법으로 출력하도록 수정하고,

그래프 출력을 보완하여 코드를 더욱 완성도 있게 만드는 것이 좋을 것입니다.

  • 결과분석
    • 색상은 파란색과 노란색 계열이 주로 있음
    • 채도는 파란색은 채도가 골고루 분포되어 있고, 노란색에 높은 채도들이 주로 분포
    • 명도는 파란색과 노락색의 밝은 색상이 주로 분포
  • HSV 색상공간의 색상분포

실습문제

○ 다른 이미지의 이차원 히스토그램을 그리고 색상 분포를 분석해보자

2  주파수 기반 이미지처리

  • LPF (Low pass filter) : 낮은 주파수 영역 (배경, 객체 내부)만 남아 있는 이미지를 추출하는 필터 - blur 필터
  • HPF (HIgh pass filter) : 높은 주파수 영역 (에지, 노이즈 등)만 남아 있는 이미지를 추출하는 필터 - 에지 검출 필터
  • 이미지를 주파수 영역으로 변환하면 다양한 주파수 영역 필터 작업이 가능해짐
  • 주파수 기반 처리 방법 : 푸리에 변환, DCT 변환, WT 변환 등

2.1  푸리에 변환 (Fourier Transform)

  • 이미지 처리에서 화소의 밝기의 변화를 분해하여 그 안에 들어 있는 주파수 성분을 추출하는 방법
  • DFT (Descrete Fourier Transform)
    • 디지털 신호에 사용
    • 복소수의 실수부와 허수부를 벡터로 하여 벡터의 크기 계산 (주파수 스펙트럼)
    • 복소수의 실수부와 허수부의 기울기 계산 (주파수 위상)

  • 주파수 스펙트럼
    • 저주파 영역이 모서리 부분에 고주파 영역이 중심부에 위치
    • 사각형의 각 모서리를 중심으로 원형의 밴드를 형성하여 주파수 영역에 분포
    • 일반적으로 보기쉽게 하기 위해 서플링을 통해 고주파 영역을 중앙으로 변경

  • f = np.fft.fft2(img) : 푸리에 변환 수행
    • 저주파 성분이 각 모서리에 배치됨
  • fshift = np.fft.fftshift(f)
    • 저주파수 성분을 각 모서리에서 중앙으로 이동하여 재배열시킴
  • m_spectrum = 20 * np.log(np.abs(fshift))
    • 진폭 스펙트럼을 계산
#실습

2.2  저주파 영역 제거 후 복원 (에지검출)

  • f_ishift = np.fft.ifftshift(fshift)
    • 재배열된 주파수 값들의 위치를 원래대로 되돌림
  • img_back = np.fft.ifft2(f_ishift)
    • 역 DFT를 수행하여 원래 이지미 영역으로 전환
#실습

2.3  저주파수 영역만 잘라서 복원

#실습

실습문제

○ 다른 이미지를 푸리에 변환하고 저주파 영역만을 잘라서 복원해보자

2.4  DCT 변환

  • 이산 코사인 변환이라고도 하며, 영상 압축을 위한 방식중의 하나
  • 영상을 NxN 블럭으로 공식을 사용해 변환하면, 분포되어 있던 화소값이 변환 후 이웃 화소 간 별 차이 없는 저주파 영역에 집중되는 것을 이용하여 압축을 시도하는 방식
  • DCT 방식을 사용하면 중복성 제거를 통해, 인간의 시각에는 둔감한 고주파 성분을 제거함으로서 압축이 가능해짐

#실습

#실습

3  Wavelet 변환

  • MPEG4 영상압축에 사용하는 기법
  • 웨이블릿 변환은 고주파 성분의 신호에 대해서는 시간 해상도를 높이고 주파수 해상도를 낮추고, 저주파 성분의 신호에 대해서는 주파수 해상도를 높이고 시간해상도를 낮춤
  • STFT가 시간 분해능과 주파수 분해능 중 하나를 포기해야했다면 웨이블릿 변환은 교묘하게 둘다 고려한 방법

#실습

[11차시] 정리하기
○ 히스토그램 (Histogram) : 이미지의 색상 별로 픽셀의 개수를 그래프로 표시한 것
 calcHist([이미지], [채널], 특정 부분 마스크, [색상 개수], [픽셀값의 범위])
  • 히스토그램을 계산
  • 채널은 흑백영상인 경우는 0, 칼라영상인 경우는 R(0), G(1), B(2)
○ 히스토그램 균일화 : 색상 분포를 균일하게 변경하여 이미지의 콘트라스트를 강조하는 방법
  • cv2.equalizeHist(img) : 히스토그램 균일화 함수
○ 주파수 기반 이미지처리
  • LPF (Low pass filter) : 낮은 주파수 영역 (배경, 객체 내부)만 남아 있는 이미지를 추출하는 필터 - blur 필터
  • HPF (HIgh pass filter) : 높은 주파수 영역 (에지, 노이즈 등)만 남아 있는 이미지를 추출하는 필터 - 에지 검출 필터
  • 이미지를 주파수 영역으로 변환하면 다양한 주파수 영역 필터 작업이 가능해짐
  • 주파수 기반 처리 방법 : 푸리에 변환, DCT 변환, WT 변환 등

파일 다운 경로 :https://github.com/yoonhyochang/Deep_learning