이미지 블러링(image blurring)

:: Image Blurring은 LPF를 이미지에 적용하여 얻을 수 있다. 고주파영역을 제거함으로써 노이즈를 제거하거나 경계선을 흐리게 하는 것이 목적. 

(LPF, HPF는 이전 글을 보면 설명이 되어있다.)

 

OpenCV에는 4가지 형태의 blurring 방법을 제공하고 있다.

1. Averaging
:: Box 형태의 커널을 이미지에 적용한 후 평균값을 box의 중심점에 적용

2. Median Filtering
:: 커널 윈도우와 픽셀의 값들을 정렬한 후에 중간값을 선택하여 적용
점 잡음(점처럼 찍힌 노이즈)을 제거하는데 효과적

3. Gaussian Filtering
:: Gaussian 함수를 이용한 커널을 적용
이미지의 전체적으로 밀도가 동일한 노이즈 , 백색노이즈를 제거하는데 가장 효과적

4. Bilateral Filtering
:: 양방향필터는 경계선을 유지하면서 Gaussian Blur 처리
Gaussian 필터를 적용하고 , 또 하나의 Gaussian 필터를 주변 픽셀까지 고려하여 적용하는 방식
경계면을 지키며 표면의 질감 등을 제거하는데 효과적

 

1. 평균 블러

:: 균일한 값을 가지는 커널을 이용한 이미지 필터링. 커널 영역내의 평균값으로 해당 픽셀을 대체

 

OpenCV에선 blur 함수로 구현되어 있다.

 

blur(src, ksize)

  • src: 원본 이미지
  • ksize: 커널 크기 (1보다 큰 홀수)

평균 블러 적용

 

2. 중앙값 블러

:: 평균이 아닌 중앙값으로 해당 픽셀을 대체.

kernel window와 pixel의 값들을 정렬한 후에 중간값을 선택하여 적용한다. 점 모양의 잡음을 제거하는 데 효과적이다.

OpenCV에서는 medianBlur 함수를 사용한다.

 

medianBlur(src, ksize)

  • src: 원본 이미지
  • ksize: 커널 크기 (1보다 큰 홀수)

중앙값 블러 적용한 이미지

 

3. 가우시안 블러

:: box filter는 동일한 값으로 구성된 kernel을 사용하지만, Gaussian Filter는 Gaussian함수를 이용한 Kernel을 적용

즉, kernel 행렬의 값을 Gaussian 함수를 통해서 수학적으로 생성하여 적용

 

OpenCV에서는 GaussianBlur로 구현되어 있다.

 

GaussianBlur(src, ksize, sigmaX)

  • src: 원본 이미지
  • ksize: 커널 크기(양수이면서 홀수)
  • sigmaX: 표준편차

백색노이즈가 있는 이미지를 가우시안 블러 처리

 

4. 양방향 필터링

:: 가우시안 필터링을 쓰면 이미지의 경계선도 흐려진다는 문제점이 있다. 따라서 경계선을 유지하면서 Gaussian 블러처리를 하는 것이 필요하다.

 

Gaussian 필터를 적용하고, 또 하나의 Gaussian 필터를 주변 pixel까지 고려하여 적용하는 방식이다.

OpenCV에서는 bilateralFilter 함수로 구현되어 있다.

 

bilateralFilter(src, d, sigmaColor, sigmaSpace)

  • src: 원본 이미지
  • d: 커널 크기
  • sigmaColor: 색공간 표준편차. 값이 크면 색이 많이 달라도 픽셀들이 서로 영향을 미친다.
  • sigmaSpace: 거리공간 표준편차. 값이 크면 멀리 떨어져있는 픽셀들이 서로 영향을 미친다.

 

 

참고 사이트

https://datascienceschool.net/03%20machine%20learning/03.02.02%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20%ED%95%84%ED%84%B0%EB%A7%81.html

 

https://opencv-python.readthedocs.io/en/latest/doc/11.imageSmoothing/imageSmoothing.html

'Project > Image Handling' 카테고리의 다른 글

이미지 필터링  (2) 2021.06.03
이미지 임계처리  (0) 2021.06.02
이미지 처리  (0) 2021.06.01

이미지 필터링(image filtering)

:: 필터(filter) 또는 커널(kernel) 또는 윈도우(window)라고 하는 정방행렬을 정의한 후 이 커널을 이동시키면서 같은 이미지 영역과 곱하여 그 결과값을 이미지의 해당 위치의 값으로 하는 새로운 이미지를 만드는 연산. 기호ⓧ를 사용

 

더보기

이미지도 주파수로 표현 가능

사물을 촬영할 때 사물과 배경의 사이 사물의 테두리 경계면이 고주파 영역이고, 일반적인 배경은 저주파이다.

 

LPF vs HPF

Low-Pass-Filter 저역 통과 필터 : 저주파만 통과시키는 필터

High-Pass-Filter 고역 통과 필터 : 고주파만 통과시키는 필터

 

LPF를 사용하면 고주파가 통과가 안되니 경계면이 유연해지거나 노이즈 제거, 블러 처리를 할 수 있고

HPF를 사용하면 이미지에서 경계선을 찾을 수 있다.

 

Kernel(커널)은 행렬을 의미하는데, 커널의 크기가 크면 이미지 전체가 blur 처리가 많이 된다. 

 

Filter 적용 방법

- 이미지의 픽셀 값의 중심으로부터 해당 커널 만큼의 영역을 평균하여 해당값을 커널값으로 나누고 이 값을 중심 픽셀값으로 취한다.

 

5x5 행렬

5x5 행렬에서. 이미지 중 하나의 픽셀을 지정한다고 하면, 그 픽셀을 중심으로 하는 5x5 범위의 모든 픽셀값을 더하고 그 값을 25로 나누고 나눈 값을 중심 픽셀값으로 정하는 것이다.

 

OpenCV는 cv2.filter2D()라는 함수를 이용해 이미지에 kernel(filter)를 적용하여 이미지 필터링이 가능하다.

이미지 픽셀 값을 해당 픽셀의 이웃과 평균하여 그 값을 취하는 averaging filter라고 한다.

 

filter2D(src, ddepth, kernel[, dst[, anchor[, delta[, borderType]]]])

  • src: 필터할 이미지
  • ddepth: 이미지 깊이(자료형 크기). 영상데이터를 저장하기 위해 사용되는 비트의 수. -1이면 소스이미지과 동일
  • kernel: 커널 행렬 (np.ones() 함수를 사용하여 행렬 생성 후 행렬 값으로 나눈 값이 포함)

+) np.ones(shape, dtype=None, order='C') : 지정된 shape의 배열을 생성하고 모든 요소를 1로 초기화. 

 

커널 사이즈에 따른 이미지 필터링 결과

 

참고 사이트

https://datascienceschool.net/03%20machine%20learning/03.02.02%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20%ED%95%84%ED%84%B0%EB%A7%81.html

 

https://opencv-python.readthedocs.io/en/latest/doc/11.imageSmoothing/imageSmoothing.html

'Project > Image Handling' 카테고리의 다른 글

이미지 블러링  (0) 2021.06.03
이미지 임계처리  (0) 2021.06.02
이미지 처리  (0) 2021.06.01

 

thresholding은 임계점, 한계점, 문턱이라는 뜻. 반올림과 비슷한 느낌

사용자가 특정 수치값을 정해놓으면 그 기준값을 통해 값을 도출함

임계처리

- 임계처리(thresholding)는 이미지 행렬에서 하나의 픽셀값을 사용자가 지정한 기준값(threshold)를 사용하여 이진화(binarization)하는 가장 단순한 필터

 

- 이진화 처리란 영상을 흑/백으로 분류하여 처리하는 것

이때 기준이 되는 임계값을 어떻게 결정할 것인지가 중요한 문제

임계값보다 크면 백, 작으면 흑이 됨

기본 임계처리는 사용자가 고정된 임계값을 결정하고 그 결과를 보여주는 단순한 형태

 

OpenCV에서는 threshold라는 함수로 구현되어 있고 인수는 아래와 같다.

  • threshold(src, thresh, maxval, type)
    • src : 그레이스케일 이미지
    • thresh : 기준값
    • maxval : 기준값을 넘었을 때 적용할 최대값
    • type : 임계처리 유형
      • THRESH_BINARY : 기준값을 넘으면 최대값 아니면 0
      • THRESH_BINARY_INV : 기준값을 넘으면 0 아니면 최대값
      • THRESH_TRUNC : 기준값을 넘으면 기준값 아니면 최대값
      • THRESH_TOZERO : 기준값을 넘으면 원래값 아니면 0
      • THRESH_TOZERO_INV : 기준값을 넘으면 0 아니면 원래값

각 임계유형의 결과를 시각화해본다.

BINARY의 경우는 이미지 픽셀값이 다 255값을 가지게 되고, BINARY_INV의 경우는 그의 반대..

이런식으로 임계값을 이용하여 이미지 또는 영상을 처리할 수 있다.

 

적응임계처리

위의 결과를 보면 한가지 문제점이 있다. 임계값을 이미지 전체에 적용하여 처리하기 때문에 하나의 이미지에 음영이 다르면 일부 영역이 모두 흰색 또는 검정색으로 보여지게 되는 것이다.

 

이런 문제를 해결하기 위해서 이미지의 작은 영역별로 thresholding을 하면 된다.

OpenCV에서는 adaptiveThreshold 함수로 구현되어 있다.

 

  • adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
    • src : 그레이스케일 이미지
    • maxValue – 기준값을 넘었을 때 적용할 값
    • adaptiveMethod : 영역 내에서 기준값을 계산하는 방법
      • ADAPTIVE_THRESH_MEAN_C: 영역 내의 평균값에 C를 뺀 값을 기준값으로 사용
      • ADAPTIVE_THRESH_GAUSSIAN_C: 영역에 추후 설명할 가우시안 블러를 적용한 후 C를 뺀 값을 기준값으로 사용
    • thresholdType : 임계처리 유형
      • THRESH_BINARY
      • THRESH_BINARY_INV
    • blockSize : 임계처리를 적용할 영역의 크기
    • C : 평균이나 가중평균에서 차감할 값

 

 

참고 사이트

https://datascienceschool.net/03%20machine%20learning/03.02.02%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20%ED%95%84%ED%84%B0%EB%A7%81.html

 

https://opencv-python.readthedocs.io/en/latest/doc/11.imageSmoothing/imageSmoothing.html

'Project > Image Handling' 카테고리의 다른 글

이미지 블러링  (0) 2021.06.03
이미지 필터링  (2) 2021.06.03
이미지 처리  (0) 2021.06.01

 

이미지 데이터를 표현하는 방식과 이미지 데이터를 처리하기 위한 파이썬 패키지 Pillow, Scikit-Image, OpenCV 패키지에 대해 알아본다.

 

픽셀

이미지 데이터는 픽셀(pixel)이라고 하는 작은 이미지를 직사각형 형태로 모은 것. 각 픽셀은 단색의 직사각형. 젠체 이미지의 크기를 표현할 때는 (세로픽셀수 x 가로픽셀수) 형식으로 표현

 

이미지 데이터를 저장할 때는 픽셀의 색을 표현하는 스칼라 값이나 벡터를 2차원 배열로 표현한다.

-> 파이썬에서는 NumPy의 ndarray 클래스 배열로 표현한다.

 

 

색공간

픽셀의 색을 숫자로 표현하는 방식을 색공간(color space)이라고 한다. 

대표적인 색공간 : 그레이스케일(gray scale), RGB(Red-Green-Blue), HSV(Hue-Saturation-Value)

 

그레이스케일

- 그레이스케일에서는 모든 색이 흑백.

- 각 픽셀은 명도를 나타내는 숫자로 표현된다.

- 0은 검은색을 나타내고 숫자가 커질수록 명도가 증가하여 하얀색이 된다.

- 숫자는 보통 0~255의 8비트 부호없는 정수로 저장된다.

 

SciPy 패키지의 misc 서브 패키지의 face 명령은 이미지 처리용 샘플 이미지를 제공한다.

인수로 gray=True를 입력하면 그레이스케일 이미지를 반환한다. 이미지의 크기는 배열의 shape 속성으로 볼 수 있다.

 

이 이미지 데이터는 768x1024 크기의 unit8 자료형 2차원 배열이다. 좌측 상단의 225개(15x15) 픽셀의 데이터를 보기 위해 아래와 같은 코드를 실행한다.

 

RGB

RGB 색공간에서 색은 적(Red), 녹(Green), 청(Blue)의 3가지 색의 명도를 뜻하는 숫자 3개가 합쳐진 벡터로 표현됨

8비트 부호없는 정수를 사용하는 경우 (255,0,0)은 빨간색, (0,255,0)은 녹색, (0.0.255)는 파란색

 

픽셀 데이터가 스칼라가 아닌 벡터이므로 이미지 데이터를 (세로픽셀수 x 가로픽셀수) 형태의 2차원 배열로 표현하지 못하고 (세로픽셀수 x 가로픽셀수 x 색채널) 형태의 3차원 배열로 저장 (세 번째 축을 색채널(channel)이라고 부름)

 

 

이미지 파일 형식

.bmp 확장자를 가지는 비트맵(bitmap) 파일은 지금까지 설명한 다차원 배열정보를 그대로 담고 있다.

하지만 비트맵 파일은 파일 용량이 크기 때문에 압축을 통해 용량을 줄인 JPG, GIF, PNG 등의 압축 파일 형식을 많이 사용한다.

 

- JPEG : Joint Picture Experts Group의 약자. 웹상 및 멀티미디어 환경에서 가장 널리 사용되고 있는 포맷. 

JPG라는 확장자도 같이 사용됨

 

- GIF : Graphics Interchange Format. 하나의 파일에 여러 비트맵을 저장하여 다중 프레임 애니메이션 구현

 

- PNG : Portable Network Graphics. GIF 포맷을 대체하기 위해 개발된 파일 포맷

문자 혹은 날카로운 경계가 있는 이미지인 경우 JPG보다 PNG가 효과적

 

 

Pillow를 이용한 이미지 처리

- Pillow는 이전에 사용되던 PIL(Python Imaging Library)패키지를 대체하기 위한 것.

- JPEG, BPM, GIF, PNG, PPM, TIFF 등의 다양한 포맷을 지원하고 초보자가 다루기 쉬움

- PIL 패키지의 대체이므로 임포트의 이름이 PIL 패키지와 같다는 점 주의

 

이미지 읽고 쓰기

 

Scikit-Image 

이 패키지도 이미지 처리에 많이 사용됨

 

OpenCV

- OpenCV(Open Source Computer Vision)은 이미지 처리, 컴퓨터 비전을 위한 라이브러리

- Windows, Linux, Mac OS, iOS, Android 등 다양한 플랫폼을 지원

- 실시간 이미지 프로세싱에 중점을 둔 라이브러리

 

- 2,500개가 넘는 알고리즘으로 구성되어 있음

 1. 영상 처리, 컴퓨터 비전, 기계 합습과 관려된 전통적인 알고리즘

 2. 얼굴 검출과 인식, 객체 인식, 객체 3D 모델 추출, 스테레오 카메라에서 3D 좌표 생성

 3. 고해상도 영상 생성을 위한 이미지 스티칭, 영상 검색, 적목 현상 제거, 안구 운동추적

 

 

 

 

참고 사이트

https://datascienceschool.net/03%20machine%20learning/03.02.02%20%EC%9D%B4%EB%AF%B8%EC%A7%80%20%ED%95%84%ED%84%B0%EB%A7%81.html

 

https://opencv-python.readthedocs.io/en/latest/doc/11.imageSmoothing/imageSmoothing.html

'Project > Image Handling' 카테고리의 다른 글

이미지 블러링  (0) 2021.06.03
이미지 필터링  (2) 2021.06.03
이미지 임계처리  (0) 2021.06.02

+ Recent posts