본문 바로가기
강의 (Lecture)/OpenCV 마스터 with Python (초급)

OpenCV + Python 히스토그램 분석

by codingwalks 2024. 10. 7.
728x90
반응형

안녕하세요. 코딩산책입니다.

히스토그램 분석은 이미지 처리에서 매우 중요한 역할을 합니다. 히스토그램은 이미지의 픽셀 값 분포를 나타내며, 밝기, 명암 대비, 이미지의 동적 범위 등을 분석하는 데 유용합니다. 이 블로그에서는 OpenCV와 Python을 활용해 다양한 히스토그램 처리 기법을 설명하고, 이를 구현하는 코드를 제시하겠습니다. 주요 개념으로는 기본 히스토그램 구하는 방법, 히스토그램 스트레칭, 히스토그램 평활화(Histogram Equalization), CLAHE(Contrast Limited Adaptive Histogram Equalization) 등을 다룹니다. 추가적으로 히스토그램 분석에서 중요한 개념 중 하나는 PDF (Probability Density Function)CDF (Cumulative Distribution Function)입니다. 이 두 함수는 이미지에서 픽셀 값의 분포를 이해하고 조정하는 데 중요한 역할을 합니다.

 

1. 히스토그램 분석

히스토그램은 각 픽셀 값(0~255)이 이미지에서 몇 번 나타나는지를 보여주는 분포 그래프입니다. 흑백 이미지의 경우 히스토그램은 단일 채널에서 계산되고, 컬러 이미지의 경우 각각의 채널(R, G, B)에 대해 별도로 계산할 수 있습니다.

1.1. 히스토그램 구하는 방법

이미지를 \( I \) 라 하고, 이 이미지가 \( M \times N \) 크기의 그레이스케일 이미지라고 가정하면, 각 픽셀 값 \( I(i, j) \) 는 \( [0, L-1] \) 사이의 값을 가집니다. 여기서 \( L \) 은 픽셀 값의 최대 개수로, 일반적으로 \( L=256 \) 입니다.

이를 수학적으로 다음과 같이 정의할 수 있습니다.

\[ h(k) = \sum_{i=0}^{M-1} \sum_{j=0}^{N-1} \delta(I(i, j) - k) \]

여기서:

• \( h(k) \) 는 픽셀 값 \( k \) 에 대한 빈도(히스토그램 값)입니다.
• \( \delta(x) \) 는 디랙 델타 함수로, \( x = 0 \) 일 때 1이고, 그렇지 않으면 0인 함수입니다. 즉, 픽셀 값이 \( k \) 와 같을 때만 1을 더합니다.
• \( I(i, j) \) 는 좌표 \( (i, j) \) 에서의 픽셀 값입니다.
• \( k \) 는 히스토그램의 빈(bin) 번호로, 일반적으로 \( k \in [0, 255] \) 입니다.

따라서, 이 공식은 이미지에서 픽셀 값이 \( k \) 일 때 그 빈도를 세는 역할을 합니다.

OpenCV에서 이미지를 분석할 때 히스토그램을 계산하는 데 cv2.calcHist 함수를 사용합니다. 이 함수는 이미지의 픽셀 값 분포를 계산하여, 각 픽셀 값이 몇 번 등장했는지를 히스토그램으로 나타냅니다. 이를 통해 이미지의 밝기, 명암 대비 등을 분석할 수 있습니다.

\[ cv2.calcHist(images, channels, mask, histSize, ranges, accumulate=False)) \]

• images: 히스토그램을 계산할 이미지 리스트 ([image] 형태)
• channels: 계산할 채널 (0: 그레이스케일, 1, 2, 3: RGB)
• mask: 히스토그램을 계산할 특정 영역을 지정하는 마스크. 전체 이미지에 대해 계산할 때는 None
• histSize: 히스토그램 빈(bin)의 개수. 보통 [256]으로 설정
• ranges: 계산할 픽셀 값의 범위. 보통 [0, 256]으로 설정
• accumulate: 이전 값에 히스토그램을 누적할지 여부 (False 기본값)

 

그레이스케일 이미지에서 히스토그램 계산:

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

# Load image (convert to black and white image)
image = cv2.imread('resources/lena.bmp', cv2.IMREAD_GRAYSCALE)

# Calculating histograms
hist = cv2.calcHist([image], [0], None, [256], [0, 256])

# Plotting PDF and CDF (Matplotlib)
plt.figure(figsize=(10, 5), linewidth=2)

# Show Image
plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')

# Histogram plot
plt.subplot(1, 2, 2)
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')

# Show plot
plt.tight_layout()
plt.savefig('results/hist1.png', dpi=200, facecolor='#eeeeee', edgecolor='black')
plt.show()

grayscale image, histogram of grayscale image

 

컬러 이미지에서 히스토그램 계산 (R, G, B 각각 계산):

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

# Load image (color image)
image = cv2.imread('resources/lena.bmp')

# Plotting PDF and CDF (Matplotlib)
plt.figure(figsize=(10, 5), linewidth=2)

# Show Image
plt.subplot(1, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title('RGB Image')
plt.axis('off')

# Calculate histogram (for each channel)
plt.subplot(1, 2, 2)
colors = ('b', 'g', 'r')
for i, color in enumerate(colors):
    hist = cv2.calcHist([image], [i], None, [256], [0, 256])
    plt.plot(hist, color=color)
plt.title('Color Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')

# Show plot
plt.tight_layout()
plt.savefig('results/hist2.png', dpi=200, facecolor='#eeeeee', edgecolor='black')
plt.show()

RGB image, histogram of RGB image

 

특정 영역에서 히스토그램 계산 (마스크 사용):

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

# Load image (convert to black and white image)
image = cv2.imread('resources/lena.bmp', cv2.IMREAD_GRAYSCALE)

# Create a mask (calculate histogram for only a part of the image)
mask = np.zeros(image.shape[:2], np.uint8)
mask[128:384, 128:384] = 255

# Calculating histogram using mask
masked_hist = cv2.calcHist([image], [0], mask, [256], [0, 256])

# Plotting PDF and CDF (Matplotlib)
plt.figure(figsize=(10, 5), linewidth=2)

# Show Image
show_image = cv2.subtract(mask, 255-image)
plt.subplot(1, 2, 1)
plt.imshow(show_image, cmap='gray')
plt.title('Grayscale Image')
plt.axis('off')

# Histogram plot
plt.subplot(1, 2, 2)
plt.plot(masked_hist)
plt.title('Masked Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')

# Show plot
plt.tight_layout()
plt.savefig('results/hist3.png', dpi=200, facecolor='#eeeeee', edgecolor='black')
plt.show()

masked grayscale image, histogram of masked grayscale image

위 코드는 OpenCV의 calcHist 함수를 사용하여 이미지의 히스토그램을 계산한 후, Matplotlib을 통해 히스토그램을 플롯하는 예제입니다.

1.2. 확률 밀도 함수 (PDF)

히스토그램을 확률적으로 해석하면 확률 밀도 함수(PDF, Probability Density Function)로 변환할 수 있습니다. 각 픽셀 값이 발생할 확률을 나타내는 PDF는 히스토그램 값을 전체 픽셀 수를 \( M \times N \으로 나눈 값입니다.

PDF는 다음과 같이 정의됩니다.

\[ P(k)=\frac{h(k)}{M\times N} \]

여기서:

• \( P(k) \) 는 픽셀 값 \( k \) 에 대한 확률입니다.
• \( M \times N \) 은 전체 픽셀 수입니다.
• \( h(k) \) 는 픽셀 값 \( k \) 의 빈도입니다.

이 공식은 픽셀 값 \( k \) 가 이미지에서 등장할 확률을 계산합니다.

PDF 계산 코드 예시:

def calculate_pdf(img):
    # Calculating histograms
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])
    # Convert to probability by dividing by total number of pixels (PDF)
    pdf = hist / np.sum(hist)
    return pdf

1.3. 누적 분포 함수 (CDF)

누적 분포 함수(CDF, Cumulative Distribution Function)는 특정 픽셀 값 이하의 모든 픽셀 값이 발생할 확률을 누적한 함수입니다. CDF는 히스토그램 평활화와 같은 기법에서 사용되며, 이미지의 픽셀 값을 다시 분포시키는 데 유용합니다.

CDF는 다음과 같이 정의됩니다.

\[ C(k) = \sum_{i=0}^{k} P(i) \]

여기서:

• \( C(k) \) 는 픽셀 값 \( k \) 이하의 모든 픽셀 값에 대한 누적 확률입니다.
• \( P(i) \) 는 픽셀 값 \( i \) 에 대한 확률(PDF)입니다.

이 공식은 \( k \) 이하의 픽셀 값들이 차지하는 비율을 누적하여 계산합니다. \( C(k) \)는 \( 0 \leq C(k) \leq 1 \) 범위에서 값을 가집니다.

CDF 계산 코드 예시:

def calculate_cdf(pdf):
    cdf = np.cumsum(pdf)
    # Normalize to 0~1 range
    cdf_normalized = cdf / cdf.max()
    return cdf_normalized

1.4. PDF와 CDF의 관계

PDF는 각 픽셀 값이 나타날 확률 분포를 나타내며, CDF는 그 확률을 누적한 값입니다. 따라서 PDF를 이용해 CDF를 계산할 수 있습니다. 히스토그램 평활화에서 CDF는 픽셀 값의 변환을 위해 사용되며, 이미지의 대비를 조정하는 데 중요한 역할을 합니다.

그레이스케일 이미지에서 히스토그램 PDF와 CDF 계산:

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

def calculate_pdf(img):
    # Calculating histograms (calculating the frequency of pixel values)
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])
    # Convert each bin to a probability by dividing it by the total number of pixels.
    pdf = hist / np.sum(hist)
    return pdf

def calculate_cdf(pdf):
    # Compute CDF by accumulating PDFs
    cdf = np.cumsum(pdf)
    # Normalize to 0~1 range
    cdf_normalized = cdf / cdf.max()
    return cdf_normalized

# Load image (convert to black and white image)
image = cv2.imread('resources/lena.bmp', cv2.IMREAD_GRAYSCALE)

# PDF Calculation
pdf = calculate_pdf(image)
    
# CDF calculation
cdf = calculate_cdf(pdf)

# Plotting PDF and CDF (Matplotlib)
plt.figure(figsize=(15, 5), linewidth=2)

# Show Image
plt.subplot(1, 3, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

# PDF plot
plt.subplot(1, 3, 2)
plt.plot(pdf, color='blue')
plt.title('PDF (Probability Density Function)')
plt.xlabel('Pixel Value')
plt.ylabel('Probability')

# CDF plot
plt.subplot(1, 3, 3)
plt.plot(cdf, color='green')
plt.title('CDF (Cumulative Distribution Function)')
plt.xlabel('Pixel Value')
plt.ylabel('Cumulative Probability')

# Show graph
plt.tight_layout()
plt.savefig('results/pdf_cdf.png', dpi=200, facecolor='#eeeeee', edgecolor='black')
plt.show()

grayscale image, PDF, CDF

 

2. 히스토그램 평활화 (Histogram Equalization)

히스토그램 평활화는 CDF를 이용해 이미지의 픽셀 값을 재분배하는 방법입니다. 이미지의 픽셀 값을 0~255 범위 내에서 고르게 분포하도록 만들기 위해 CDF를 기반으로 픽셀 값을 변환합니다. 이를 통해 이미지의 명암 대비를 높일 수 있습니다.

변환된 픽셀 값  \( T(x) \) 는 다음과 같이 계산됩니다.

\[ T(x) = round((L - 1) \cdot C(x)) \]

여기서:

\( T(x) \) 는 변환된 픽셀 값입니다.
\( L \) 은 그레이스케일 레벨 수(일반적으로 256).
\( C(x) \) 는 픽셀 값 ((x)) 에 대한 누적 분포 함수(CDF).
\( round(\cdot) \) 는 반올림 함수를 의미합니다.

이 변환을 통해 이미지의 픽셀 값이 균일하게 분포하도록 조정됩니다.

cv2.equalizeHist를 사용하는 예시:

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

# Load image (convert to black and white image)
image = cv2.imread('resources/lena.bmp', cv2.IMREAD_GRAYSCALE)

# Apply histogram equalization
equalized_image = cv2.equalizeHist(image)

# Plotting PDF and CDF (Matplotlib)
plt.figure(figsize=(10, 5), linewidth=2)

plt.subplot(1, 2, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 2, 2)
plt.imshow(equalized_image, cmap='gray')
plt.title('Equalized Image')
plt.axis('off')

# Show image
plt.tight_layout()
plt.savefig('results/hist_equalize1.png', dpi=200, facecolor='#eeeeee', edgecolor='black')
plt.show()

 

CDF 계산을 사용한 히스토그램 평활화 예시:

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

def calculate_pdf(img):
    # Calculating histograms
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])
    # Convert to probability by dividing by total number of pixels (PDF)
    pdf = hist / np.sum(hist)
    return hist, pdf
    
def calculate_cdf(pdf):
    # Compute CDF by accumulating PDFs
    cdf = np.cumsum(pdf)
    # Normalize to 0~1 range
    cdf_normalized = cdf / cdf.max()
    return cdf_normalized
    
# Calculating and applying CDF during histogram equalization process
def histogram_equalization(img):
    # PDF Calculation
    hist, pdf = calculate_pdf(img)
    # CDF Calculation
    cdf = calculate_cdf(pdf)
    # Mapping pixel values using CDF
    return hist, np.round(np.interp(img.flatten(), range(256), cdf*255)).reshape(img.shape).astype(np.uint8)
    
# Load image (convert to grayscale image)
image = cv2.imread('resources/lena.bmp', cv2.IMREAD_GRAYSCALE)

# Apply histogram equalization
hist, equalized_image = histogram_equalization(image)

# Plotting PDF and CDF (Matplotlib)
plt.figure(figsize=(20, 5), linewidth=2)

plt.subplot(1, 4, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 4, 2)
plt.plot(hist, color='black')
plt.title('Original Image Histogram')

plt.subplot(1, 4, 3)
plt.imshow(equalized_image, cmap='gray')
plt.title('Equalized Image')
plt.axis('off')

# Calculating histograms of eqaulized image
equalized_hist = cv2.calcHist([equalized_image], [0], None, [256], [0, 256])
plt.subplot(1, 4, 4)
plt.plot(equalized_hist, color='black')
plt.title('Equalized Image Histogram')

# Show Image
plt.tight_layout()
plt.savefig('results/hist_equalize2.png', dpi=200, facecolor='#eeeeee', edgecolor='black')
plt.show()

original image, histograms of original image, equalized image, histograms of equalized image

PDF와 CDF는 이미지 히스토그램 분석에서 중요한 개념입니다. PDF는 픽셀 값의 분포를 확률로 나타내고, CDF는 그 확률을 누적하여 나타냅니다. 특히 히스토그램 평활화와 같은 기법에서 CDF는 이미지의 대비를 개선하는 데 중요한 역할을 합니다. 이러한 이론적 배경을 바탕으로 다양한 이미지 처리 기법을 적용할 수 있습니다.

 

3. CLAHE (Contrast Limited Adaptive Histogram Equalization)

기본 히스토그램 평활화(Histogram Equalization)는 이미지 전체에 대한 히스토그램을 평활화하여 명암을 균일하게 만들어주지만, 이는 이미지의 세부적인 부분에서 지나치게 강한 대비 변화가 생길 수 있는 단점이 있습니다. 반면, CLAHE(Contrast Limited Adaptive Histogram Equalization)는 이미지를 작은 타일로 분할한 후 각 타일에서 히스토그램을 개별적으로 평활화하기 때문에, 국부적(local)인 대비를 개선할 수 있습니다. CLAHE는 특히 이미지의 어두운 영역이나 밝은 영역이 과도하게 강조되는 문제를 해결하는 데 유리합니다. 또한, 대비 한계(Contrast Limiting)를 적용하여 너무 많은 픽셀 값이 같은 구역에 몰리는 것을 방지하고, 이미지의 노이즈나 인공적인 부분이 두드러지지 않도록 제어합니다. CLAHE는 주로 의학 이미지(예: X-ray), 인공위성 이미지 등에서 세부적인 대비를 강조해야 하는 상황에서 자주 사용됩니다.

3.1. 대비 제한 (Contrast Limiting)

CLAHE에서 중요한 부분은 대비 한계(contrast limiting)입니다. 픽셀 값이 너무 자주 발생하는 경우(즉, 히스토그램의 특정 빈이 너무 높은 경우), 이를 제한하여 대비가 너무 극단적으로 변하는 것을 방지합니다. 이를 위해, 히스토그램을 제한값(clip limit)으로 자르고, 초과된 빈(bin)들은 다른 빈에 균등하게 분배합니다.

\[ h_{\text{clip}}(x) = \min(h(x), \text{clip_limit}) \]

여기서 \( h(x) \) 는 픽셀 값  \( x \) 에 대한 원래의 히스토그램 빈 값이며,  \( \text{clip_limit} \) 는 히스토그램에서 최대 허용 빈도를 의미합니다. 이 제한된 값을 기반으로 CDF를 다시 계산하여 픽셀 값을 변환합니다.

3.2. 양선형 보간 (Bilinear Interpolation)

지역 히스토그램 평활화를 적용한 후, 인접한 구역들 간의 부드러운 전환을 위해 양선형 보간(bilinear interpolation)을 사용하여 구역 경계에서의 부자연스러운 전환을 최소화합니다. 이는 인접한 타일의 픽셀 값을 적절하게 혼합하는 과정입니다.

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

# Load image (convert to grayscale image)
image = cv2.imread('resources/x-ray.jpg', cv2.IMREAD_GRAYSCALE)

# Apply basic histogram equalization
equalized_image = cv2.equalizeHist(image)

# Apply CLAHE
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
clahe_image = clahe.apply(image)

plt.figure(figsize=(12, 8))

plt.subplot(1, 3, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

plt.subplot(1, 3, 2)
plt.imshow(equalized_image, cmap='gray')
plt.title('Histogram Equalization')
plt.axis('off')

plt.subplot(1, 3, 3)
plt.imshow(clahe_image, cmap='gray')
plt.title('CLAHE')
plt.axis('off')

plt.tight_layout()
plt.show()

Original, Equalized, CLAHE

 

4. 히스토그램 스트레칭 (Histogram Stretching)

히스토그램 스트레칭은 이미지의 명암 대비를 개선하기 위한 기법입니다. 이미지의 최소 및 최대 픽셀 값을 기반으로 전체 범위(0~255)로 확장시킵니다.

픽셀 값을 \( p(x) \) 라고 할 때, 스트레칭된 픽셀 값 \( p'(x) \) 는 다음과 같이 계산됩니다.

\[ p'(x) = \frac{p(x) - p_{\text{min}}}{p_{\text{max}} - p_{\text{min}}} \times 255 \]

여기서 \( p_{\text{min}} \) 은 이미지의 최소 픽셀 값, \( p_{\text{max}} \) 는 최대 픽셀 값입니다.

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

def histogram_stretching(img):
    # Calculate minimum and maximum pixel values of an image
    min_val = np.min(img)
    max_val = np.max(img)

    # Apply histogram stretching
    stretched = ((img - min_val) / (max_val - min_val) * 255).astype(np.uint8)
    return stretched

# Load image (convert to black and white image)
image = cv2.imread('resources/lena.bmp', cv2.IMREAD_GRAYSCALE)

# Histogram stretching
stretched_image = histogram_stretching(image)

# Plotting PDF and CDF (Matplotlib)
plt.figure(figsize=(20, 5), linewidth=2)

plt.subplot(1, 4, 1)
plt.imshow(image, cmap='gray')
plt.title('Original Image')
plt.axis('off')

# Calculating histograms of original image
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
plt.subplot(1, 4, 2)
plt.plot(hist, color='black')
plt.title('Original Image Histogram')

plt.subplot(1, 4, 3)
plt.imshow(stretched_image, cmap='gray')
plt.title('Stretched Image')
plt.axis('off')

# Calculating histograms of stretched image
stretched_hist = cv2.calcHist([stretched_image], [0], None, [256], [0, 256])
plt.subplot(1, 4, 4)
plt.plot(stretched_hist, color='black')
plt.title('Stretched Image Histogram')

# Show image
plt.tight_layout()
plt.savefig('results/hist_stretched.png', dpi=200, facecolor='#eeeeee', edgecolor='black')
plt.show()

original image, histograms of original image, stretched image, histograms of stretched image

 

5. 히스토그램 매칭 (Histogram Matching)

히스토그램 매칭은 한 이미지의 히스토그램을 다른 이미지의 히스토그램과 일치시키는 기법입니다. 이는 이미지 간의 시각적 일관성을 높이는 데 사용됩니다. 히스토그램 매칭은 Target 이미지의 CDF와 Source 이미지의 CDF를 비교하여 새로운 픽셀 값을 할당하는 방식으로 동작합니다. Target CDF에 맞춰 Source 이미지의 픽셀을 재분배합니다.

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

def calculate_pdf(img):
    # Calculating histograms (calculating the frequency of pixel values)
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])
    # Convert each bin to a probability by dividing it by the total number of pixels.
    pdf = hist / np.sum(hist)
    return pdf

def calculate_cdf(pdf):
    # Compute CDF by accumulating PDFs
    cdf = np.cumsum(pdf)
    # Normalize to 0~1 range
    cdf_normalized = cdf / cdf.max()
    return cdf_normalized

def histogram_matching(source, target):
    # Calculating PDF
    source_pdf = calculate_pdf(source)
    target_pdf = calculate_pdf(target)

    # Calculating CDF
    source_cdf_normalized = calculate_cdf(source_pdf)
    target_cdf_normalized = calculate_cdf(target_pdf)

    # Create a matching table
    mapping = np.interp(source_cdf_normalized, target_cdf_normalized, np.arange(256))

    # Apply matching results
    matched_image = mapping[source.flatten()].reshape(source.shape)
    return matched_image.astype(np.uint8)

source_image = cv2.imread('resources/lena.bmp', cv2.IMREAD_GRAYSCALE)
target_image = cv2.imread('resources/baboon.bmp', cv2.IMREAD_GRAYSCALE)

matched_image = histogram_matching(source_image, target_image)

# Plotting PDF and CDF (Matplotlib)
fig, axes = plt.subplots(2,3, figsize=(10,5))

axes[0][0].imshow(source_image, cmap='gray')
axes[0][0].set_title('Source Image')
axes[0][0].axis('off')
axes[1][0].plot(source_hist, color='black')

axes[0][1].imshow(target_image, cmap='gray')
axes[0][1].set_title('Target Image')
axes[0][1].axis('off')
axes[1][1].plot(target_hist, color='black')

axes[0][2].imshow(matched_image, cmap='gray')
axes[0][2].set_title('Matched Image')
axes[0][2].axis('off')
matched_hist = cv2.calcHist([matched_image], [0], None, [256], [0, 256])
axes[1][2].plot(matched_hist, color='black')

# Show image
plt.tight_layout()
plt.savefig('results/hist_matched.png', dpi=200, facecolor='#eeeeee', edgecolor='black')
plt.show()

histogram matching

 

6. 결론

히스토그램 분석을 통해 이미지를 분석하고 개선할 수 있는 다양한 기법을 살펴봤습니다. 기본적인 히스토그램 계산부터 히스토그램 평활화(equalization), 스트레칭(stretching), CLAHE, 그리고 히스토그램 매칭(matching)까지 여러 기법을 OpenCV와 Python으로 구현할 수 있습니다. 추가적으로 PDF와 CDF는 이미지 히스토그램 분석에서 중요한 개념입니다. PDF는 픽셀 값의 분포를 확률로 나타내고, CDF는 그 확률을 누적하여 나타냅니다. 특히 히스토그램 평활화와 같은 기법에서 CDF는 이미지의 대비를 개선하는 데 중요한 역할을 합니다. 각 기법의 이론적 배경과 수학적 원리 또한 설명했으니, 이를 활용해 다양한 이미지 처리 작업을 수행할 수 있을 것입니다.

 

해당 포스트가 유용하셨다면 하단의 좋아요와 구독하기 부탁드립니다. ^^

Buy me a coffee

 

[Codingwalks]에게 송금하기 - AQR

[Codingwalks]에게 송금하기 - AQR

aq.gy

★ 모든 내용은 아래의 링크를 참조하였습니다. ★

 

OpenCV: OpenCV-Python Tutorials

Core Operations In this section you will learn basic operations on image like pixel editing, geometric transformations, code optimization, some mathematical tools etc.

docs.opencv.org

 

728x90
반응형