히스토그램은 영상의 명암값 프로필을 보여주기 위해 사용합니다.
이러한 히스토그램은 데이터의 분포를 시각화하는 그래프중 하나로, 데이터의 빈도를 나타내는 도표입니다.
데이터를 구간으로 나누고 각 구간에 속하는 데이터의 빈도를 막대 형태로 표현합니다. 이러한 히스토그램은 데이터의 분포를 파악하고 데이터의 특성을 이해하는데 도움이 됩니다.
히스토그램 평활화: 히스토그램이 평평하게 되도록 영상을 조작해 영상의 명암 대비를 높이는 기법
히스토그램 평활화는 이미지 처리 기술중 하나로, 이미지의 히스토그램을 변환하여 이미지의 대비를 향상시키는 과정을 말합니다. 이미지의 밝기 분포를 재조정하여, 어두운 영역과 밝은 영역의 대비를 높여 이미지의 시각적 품질을 향상시키는 목적으로 사용됩니다.
누적 정규화 히스토그램은 다음과 같은 과정을 통해 계산됩니다.
1.히스토그램 계산: 먼저 입력 이미지의 픽셀 값 분포를 나타내는 히스토그램을 계산합니다. 이는 각 픽셀값이 나타나는 빈도수를 계산하여 히스토그램으로 표현하는 것입니다.
2. 정규화: 히스토그램의 값들을 0과1사이의 범위로 정규화 합니다. 이는 히스토그램의 값을 전체 픽셀수로 나누어 주는 과정입니다, 정규화된 히스토그램은 각 픽셀값이 전체 픽셀값 범위에서 차지하는 비율을 나타냅니다.
3. 누적: 정규화된 히스토그램 값을 누적하여 누적 히스토그램을 계산합니다. 이는 각 픽셀값의 누적 분포를 나타내며, 히스토그램에서의 누적 빈도수를 계산하는 것입니다.
히스토그램 평활화
import cv2 as cv
import matplotlib.pyplot as plt
#matplotlib 라이브러리는 파이썬에서 데이터를 시각화하기 위해 사용
img=cv.imread('mistyroad.jpg')
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#gray변수에 명암 영상으로 변환한것 넣어주기
plt.imshow(gray,cmap='gray'),plt.xticks([]),plt.yticks([]),plt.show()
#plt.imshow함수는 matplotlib를 사용하여 이미지를 표시할때 사용되는 함수로 cmap을 통하여 이미지의
#컬러맵을 설정할수있습니다 gray로 설정하면 회색 스케일로 표현됩니다.
#plt.xticks([])와 plt.yticks([])는 x축과 y축의 눈금을 표시하지 않도록 설정하는 함수입니다. []를 입력하면 눈금이 설정되지않습니다,
#plt.show함수는 그래프를 화면에 표시하는 함수입니다.
h=cv.calcHist([gray],[0],None,[256],[0,256])
plt.plot(h,color='r',linewidth=1),plt,show()
#cv.calcHist()함수는 opencv에서 이미지의 히스토그램을 계산하는 함수이며, 이미지 데이터에 대한 히스토그램을
#구할수 있습니다. 이 인자들에 대해서 설명할게용
#image: 히스토그램을 계산할 이미지 데이터임. 리스트 형태로 입력하며 여려개의 이미지를 동시에 처리 가능
#이 코드에서는 gray라는 이미지의 데이터 사용
#channels: 히스토그램을 계산할 체널 그레이스케일 이미지의 경우에는 [0]으로 설정하면됨.
#mask: 이미지의 특정 영역에 대해서만 히스토그램을 계산할때 사용하는 마스크임. 전체 이미지를 사용할 경우네는 None으로 설정.
#histSize: 히스토그램의 빈 개수. 히스토그램의 해상도를 설정 이 코드에서는 [256]으로 설정이되어있어서,
#[256]개의 빈(bin)으로 히스토그램이 계산됨.
#ranges: 히스토그램의 값의 범위. 위 예제에서는 [0,256]으로 설정이되어있어서 0부터 256까지의 값의
#범위 내에서 히스토그램이 계산됨.
#정리하자면 이 코드는 gray라는 이미지데이터에 대한 그레이스케일 이미지의 히스토그램을 계산하고,
#계산된 히스토그램을 h라는 변수에 저장함 이 히스토그램의 빈(bin)개수는 256개로 설정되어있고,
#그 값의 범위는 0부터 256까지로 설정되어있음.
equal=cv.equalizeHist(gray)
plt.imshow(equal,cmap='gray'),plt.xticks([]),plt.yticks([]),plt.show()
#cv.equalizeHist함수는 opencv에서 이미지의 히스토그램을 평활화하는 함수로 이미지의 명암비를
#개선하여 이미지의 전체적인 대비를 향상시키는 데에 사용됨.
#함수의 인자로는 그레이스케일 이미지 데이터가 입력되어야함.
h=cv.calcHist([equal],[0],None,[256],[0,256])
plt.plot(h,color='r',linewidth=1),plt,show()
#equal이라는 이미지 데이터에 대한 히스토그램을 계산하고, 계산된 히스토그램을 h라는 변수에 저장함
이렇게 히스토그램을 평활화 한것과 안한것에 대하여 각각 구해보면 이러한 결과가 나옴.
이렇듯 히스토그램 평활화를 통해서 우리가 얻을수있는것들은
대비향상: 이미지의 히스토그램이 일정한 범위 내에 고르게 분포되면, 이미지의 명암비가 개선되어 더 선명하고 명확한 이미지를 얻을 수 있습니다.
이미지 개선: 이미지에서 특정 명암 값 범위에 해당하는 정보를 강조하거나, 잡음을 감소시킬수있습니다.
전처리 작업: 히스토그램 평활화는 이미지 전처리 작업으로도 활용될 수 있습니다. 예를들어 이미지 분류나 객체 검출 등의 작업을 수행하기 전에 이미지의 히스토그램을 평활화하여 입력 이미지의 품질을 향상 시키는데에 활용될 수 있습니다.
임계값에 의한 영상 이진화처리
만약 임계값을 128로 설정한다면 이미지의 각 픽셀값이 128보다 크면 흰색 128보다 작거나 같으면 검은색으로 변환될 것입니다. 이는 임계값 이상의 픽셀을 흰색으로, 임계값 이하의 픽셀을 검은색으로 구분하는 이진화 처리를 말합니다.
임계값(경계값)을 자동으로 결정하는 방법들
Gonzalez 이진화 방법:
1.경계값 T의 초기값을 추정한다( 제안된 추정 값은 영상에서 밝기의 최소값과 최대값 사이의 중간값)
2.경계값T로 이진화(영상분할)한다. 그 결과는 밝기값이 T보다 큰 화소들로 구성된 영역(G1)과 밝기값이 T보다 작은 화소들로 구성된 영역(G2)의 화소들로 나누어진다.
3.영역 G1과 G2에 대하여 화소들의 밝기의 평균값(U1,U2)를 계산한다.
4.연속적으로 다음과 같은 새로운 경계값을 계산한다(T = (U1+U2)/2)
5.연속적인 반복에서 경계값의 변화가 미리 정의된 오차 A보다 적을때까지 단계 2에서 4까지 반복한다.
Otsu 이진화방법:
1. 이미지의 히스토그램을 계산한다.
2. 히스토그램의 각 빈(bin)에 대해 임계값을 변경하면서, 클래스 내 분산과 클래스간 분산을 계산합니다.
3. 각 임계값에 대해 클래스 내 분산과 클래스 간 분산의 비율을 계산합니다.
4. 클래스 내 분산과 클래스 간 분산의 비율이 최대화되는 임계값을 선택합니다.
5.선택된 임계값을 사용하여 이미지를 이진화합니다. 임계값보다 낮은 값은 배경(0)으로, 임계값보다 높은 값은 전경(1)으로 할당됩니다.
'computer_vision' 카테고리의 다른 글
영상 영역 처리 (0) | 2023.04.19 |
---|---|
이진화 (0) | 2023.04.17 |
픽셀기반 영상처리-산술연산 (0) | 2023.04.16 |
영상처리 (0) | 2023.04.16 |
colormap (0) | 2023.04.16 |