영상신호 영역처리란?

출력화소를 만들기위해서 입력 화소 뿐만 아니라 입력화소 주위에있는 화소들을 사용하여 컨볼루션을 통하여 이루어짐

디지털영상에서 화소간의 관계

디지털 영상에서 각각의 화소는 고정된 위치를 가지며 이 위치는 x,y좌표를 이용하여 표현됩니다. 이때, x,y좌표는 픽셀좌표로 불리며, 각 화소의 위치는 이러한 좌표에 의해 결정됩니다.

또한 영상의 각 화소는 이전화소와 다음화소와의 관계를 가집니다. 이 관계는 픽셀의 순서에 따라 달라지며, 특히 영상처리 기술중에는 인접한 화소들간의 관계가 중요한 역할을 합니다. 인접한 화소들 간의 관계는 대개 4방향(위,아래,왼,오) 또는 

8개 방향(대각선 포함)으로 정의됩니다.

 

실제 영상에서의 공간 주파수

영상공간 주파수는 영상에서의 특정 공간 주기의 변화가 얼마나 빈번하게 나타나는지를 나타내는 매개변수임.

주파수 도메인에서는 고주파수와 저주파수가 있는데 고주파수는 이미지에서 변화가  많은 부분(경계선,엣지 등)을 나타내며, 저주파수는 이미지에서 변화가  적은 부분(평탄한 영역)을 나타냅니다.

 

 

컨볼루션

컨볼루션은 입력영상과 필터(커널)을 이용하여 특징 맵을 만드는 연산 방법임.

입력영상과 필터간의 행렬 곱셈 연산으로 이루어짐 필터는 작은 크기의 행렬로 정의되며, 입력 영상을 지나가면서 필터와의 곱셈을 수행하며, 이 과정에서 특징 맵이 만들어짐.

이때 필터는 입력 영상의 특정 영역을 지정하여 해당 영역에 대한 특징을 추출하는 역할을 함.

 

컨볼루션 마스크는 이미지나 영상 처리에서 사용되는 필터(커널)임.

컨볼루션 마스크는 입력 영상을 지나가면서 각 픽셀의 값을 조정하여 새로운 출력 영상을 생성하는 역할을 함.

수직 경계 검출을 위한 마스크: [-1 0 1; -1 0 1; -1 0 1]

수평 경계 검출을 위한 마스크: [-1 -1 -1; 0 0 0; 1 1 1]

컨볼루션 마스크는 이미지 처리에서 이미지의 특정 부분에 대해 필터를 적용하여 특정한 연산을 수행하는데 사용됨.

이것은 영상처리에서 주변 픽셀의 값에 따라 해당 픽셀의 색상 값을 변경하는데 사용됨.

입력화소의 근방에서 화소의 가중 합으로 표현,

행렬로 표현되는 가중치는 컨볼루션 마스크 혹은 컨볼루션 커널이라함.

이미지 스무딩, 샤프닝, 에지검출등과같은 영상처리에 효과적으로 사용

 

컨볼루션은 각 화소에 필터 u를 적용해 곱의 합을 구하는 연산

 

목적에 따라 다양한 필터를 사용함

 

데이터 형 

opencv는 영상화소를 주로 numpy.uint8형으로 표현함(0,255범위)

0,255범위를 벗어나는 경우에는 문제가 생김

 

컨볼루션 적용(가우시안 스무딩과 엠보싱하기)

import cv2 as cv
import numpy as np

img=cv.imread('soccer.jpg')
img=cv.resize(img,dsize=(0,0),fx=0.4,fy=0.4)
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
cv.putText(gray,'soccer',(10,20),cv.FONT_HERSHEY_SIMPLEX,0.7,(255,255,255),2)
cv.imshow('original',gray)

smooth=np.hstack((cv.GaussianBlur(gray,(5,5),0.0),
                  cv.GaussianBlur(gray,(9,9),0,0),cv.GaussianBlur(gray,(15,15),0.0)))
#opencv를 사용하여 이미지를 smoothing하는 코드. cv.gaussianBlur()함수는 가우시안 필터링을
#수행하는 함수임. 첫번째 인자는 입력이미지이고 두번째 인자는 필터크기(너비와높이)를 정의하는 튜플
#세번째 인자는 x와y의 방향의 표준 편차값을 정의하는 인자 만약 0으로 설정하면 함수가 자동으로 표준편차값 계산
#이 코드는 3개의 가우시안 필터링 결과를 수평으로 연결하여 하나의 이미지로 만들고있음.
#np.hstack함수는 입력된 배열들을 수평 방향으로 연결하여 하나의 배열로 만들어줌. 생성된 이미지는 smooth변수에 할당

cv.imshow('smooth',smooth)

femboss=np.array([[-1.0,0.0,0.0],
                  [0.0,0.0,0.0],
                  [0.0,0.0,1.0]])
#이 커널은 3x3으로 이루어져있으며 이미지에서 주변 픽셀과의 밝기 차이를 계산하여
#픽셀값의 대비를 강조하는 효과를 만듬

gray16=np.int16(gray)
#opencv를 사용하여 로드한 이미지를 int16자료형으로 변환하는 코드
emboss=np.uint8(np.clip(cv.filter2D(gray16,-1,femboss)+128,0,255))
#gray16이라는 이미지에 emboss필터를 적용하여 새로운 이미지를 생성하는 코드
#cv.filter2D함수는 2차원 필터를 이미지에 적용하는 함수 첫번째 인자는 입력 이미지, 두번째 인자는 커널
#세번째 인자는 출력 이미지의 깊이 -1로 설정하면 입력이미지와 동일한 깊이를 가진 출력 이미지 생성
#이 코드에서는 gray16이미지에 femboss필터를 적용하여 새로운 이미지를 생성하고있음
#다음으로 이미지에 128을 더해준다음 0,255사이의 값으로 클리핑 함.
#이는 출력 이미지의 범위를 0~255사이의 값으로 제한하여 출력 이미지가 8비트 정수형으로 표현될수있도록 함

emboss_bad=np.uint8(cv.filter2D(gray16,-1,femboss)+128)
#np.uint8은 numpy에서 제공하는 8비트 부호없는 정수형 자료형 0~255사이의 값 표현 가능
#emboss_bad라는 변수에 gray16이라는 이미지를 엠보싱하여 128을 더해주고 이 이미지를 할당해줌

emboss_worse=cv.filter2D(gray,-1,femboss)
#emboss_worse에 gray라는 이미지를 엠보싱하여 할당해줌

cv.imshow('emboss',emboss)
cv.imshow('emboss_bad',emboss_bad)
cv.imshow('emboss_worse',emboss_worse)
#이미지들을 출력해줌

cv.waitKey()
cv.destroyAllWindows()

결과물

컨볼루션의 평활화: 이미지의 노이즈를 제거하고, 이미지를 부드럽게 만드는 작업.

 

저역통과필터

공간 저역통과 필터는 영상의 저주파 성분을 그대로 통과시키고, 고주파 성분은 감쇄되는 효과

저역통과 컨볼루션 마스크는 현재 입력화소의 밝기값 주변의 8개의 이웃화소밝기값과 자기자신의 밝기값을 평균하는 역할

고주파성분이 많은 영상의 경계선영역의 경우 이러한 저역통과 필터 처리로 인하여 급격한 밝기변화가 완만한 변화로 감쇄되는 현상이 나타남

-> 이러한 시각적효과를 영상흐림화 라고함

 

고역통과필터

고역통과필터는 저역통과필터의 반대효과 

저주파 성분은 감쇄시키는 반면에 고주파 성분은 통과시키는 특징

영상에서 엣지와같은 고주파 성분이 있는 부분을 더욱 강조하는 샤프닝효과

고역통과필터링은 흐릿한 영상을 샤프닝 처리하는데도 많이 사용

 

경계선 검출

영상의 경계선은 사물의 윤곽, 위치, 크기등을 나타내고 영상의 밝기와 색이 급격한 변화가 있는 경우 경계선(엣지)이 존재

다양한 경계선 검출 컴볼루션 마스크

Prewitt 마스크

엣지 검출을 위해 사용되며 이미지에서 엣지를 찾아내는데 유용함.

sobel 마스크

 

'computer_vision' 카테고리의 다른 글

잡음 제거 알고리즘  (0) 2023.04.20
이진화  (0) 2023.04.17
히스토그램(histogram)  (0) 2023.04.16
픽셀기반 영상처리-산술연산  (0) 2023.04.16
영상처리  (0) 2023.04.16

+ Recent posts