Tech & Development/Image Processing

[OpenCV] Basic 12 - 이미지 필터 (Filters) 적용

Theo (테오) 2024. 11. 20. 11:34
반응형

이미지 필터는 이미지에 다양한 효과를 적용하거나, 특정 특징을 강조하고 노이즈를 제거하는 데 사용됩니다. OpenCV는 여러 가지 필터를 제공하며, 상황에 따라 적절한 필터를 선택해 이미지를 처리할 수 있습니다. 기본적으로 많이 사용하는 필터에는 블러링 필터샤프닝 필터, 엠보싱 필터가 있습니다.

Import packages

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

Function to Display Images in Jupyter Notebook

Jupyter Notebook 및 Google Colab에서 이미지를 표시할 수 있도록 Function으로 정의합니다.

def img_show(title='image', img=None, figsize=(8, 5)):
    plt.figure(figsize=figsize)

    if type(img) == list:
        titles = title if type(title) == list else [title] * len(img)

        for i in range(len(img)):
            rgbImg = cv2.cvtColor(img[i], cv2.COLOR_GRAY2RGB) if len(img[i].shape) <= 2 else cv2.cvtColor(img[i], cv2.COLOR_BGR2RGB)
            plt.subplot(1, len(img), i + 1)
            plt.imshow(rgbImg)
            plt.title(titles[i])
            plt.xticks([]), plt.yticks([])

        plt.show()
    else:
        rgbImg = cv2.cvtColor(img, cv2.COLOR_GRAY2RGB) if len(img.shape) < 3 else cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
        plt.imshow(rgbImg)
        plt.title(title)
        plt.xticks([]), plt.yticks([])
        plt.show()

Load Image

이미지를 불러옵니다.

cv2_image = cv2.imread('asset/images/test_image.jpg')
img_show("Original Image", cv2_image)

1. 평균 블러 (Average Blur)

평균 블러는 주변 픽셀의 평균값을 사용하여 이미지의 노이즈를 제거하고 부드러운 효과를 만듭니다.

2. 가우시안 블러 (Gaussian Blur)

가우시안 블러는 가우시안 커널을 사용하여 이미지를 부드럽게 처리합니다. 이 방식은 노이즈 제거에 유용하며, 특히 Gaussian 분포에 따라 가중치를 적용해 블러링 효과를 줄 수 있습니다.

3. 미디안 블러 (Median Blur)

미디안 블러는 커널 내 픽셀 값의 중간값으로 대체하여 노이즈를 제거합니다. 특히 점 노이즈(Salt and Pepper Noise)를 제거하는 데 효과적입니다.

average_blur = cv2.blur(cv2_image, (5, 5))
gaussian_blur = cv2.GaussianBlur(cv2_image, (5, 5), 0)
median_blur = cv2.medianBlur(cv2_image, 5)
img_show(["Average Blur", "Gaussian Blur", "Median Blur"], [average_blur, gaussian_blur, median_blur])

4. 샤프닝 필터 (Sharpening)

샤프닝 필터는 이미지를 더 선명하게 만들어주며, 엣지(Edge)를 강조하는 효과가 있습니다. 커널을 직접 정의하여 샤프닝을 적용할 수 있습니다.

# 샤프닝 커널 생성
sharpening_kernel = np.array([[0, -1, 0], 
                              [-1, 5, -1], 
                              [0, -1, 0]])
sharpened_image = cv2.filter2D(cv2_image, -1, sharpening_kernel)
img_show("Sharpened Image", sharpened_image)

5. 엠보싱 필터 (Emboss)

엠보싱 필터는 이미지에 입체감(엠보싱) 효과를 부여합니다. 주로 회색조 이미지에 적용하며, 커널을 사용해 엠보싱 효과를 줍니다.

# 엠보싱 커널 생성
emboss_kernel = np.array([[-2, -1, 0], 
                          [-1, 1, 1], 
                          [0, 1, 2]])
emboss_image = cv2.filter2D(cv2_image, -1, emboss_kernel)
img_show("Embossed Image", emboss_image)

6. 커스텀 필터 (Custom Filter)

사용자가 원하는 커널을 정의하여 특정 효과를 줄 수 있습니다. 예를 들어, 엣지 검출, 흐림, 선명함 등 다양한 효과를 직접 만들 수 있습니다.

# 예시: 간단한 엣지 검출 필터
edge_kernel = np.array([[-1, -1, -1],
                        [-1, 8, -1],
                        [-1, -1, -1]])
edge_image = cv2.filter2D(cv2_image, -1, edge_kernel)
img_show("Edge Detection Filter", edge_image)

요약

이미지 필터를 통해 다양한 효과를 적용하여 이미지의 노이즈를 줄이거나, 경계를 강조하고, 입체감을 줄 수 있습니다. OpenCV의 기본 필터뿐만 아니라 커스텀 커널을 활용하여 원하는 효과를 자유롭게 적용할 수 있습니다.

반응형