y(t) = s(t)+n(t)

y(t): 시간 t에 측정된 결과값

s(t): 실제 잡음이 없는 실제 신호값

n(t): 환경적인 요인(열, 전기적)에 의하여 발생되는 잡음(노이즈) 신호값

영상에서의 잡음(노이즈)의 종류

 

광전자에 의한 노이즈:

광소자노이즈

열에 의한 노이즈

 

임펄스성 노이즈:

'salt and pepper"노이즈(소금과 후추를 뿌려놓은것처럼 잡음이 점을 흩뿌려져있듯이 생겨서 그럼)

가우시안 노이즈, 임펄스 노이즈

 

구조적 노이즈:

압축과정에 의한 노이즈,

상호간섭에 의한 노이즈등

 

잡음제거

가우시안 잡음: 정규 분포를 갖는 잡음, 영상의 픽셀 값으로부터 불규칙적으로 벗어나지만, 뚜렷하게 벗어나지 않음

임펄스 잡음: 영상의 픽셀 값과는 뚜렷하게 다른 픽셀 값에 의한 잡음. 0,255와 같은 뚜렷하게 잘못된 밝기 값을 갖는 화소

잡음제거 알고리즘

 

평균 마스크:

가우시안 노이즈를 줄이는데 효과적

임펄스 노이즈에는 비효과적

영상의 대비를 약화시킴.

중간값 필터링:

임펄스 잡음을 제거하기위한 효과적인 방법

경계선을 보존 또는 강화

 

 

'computer_vision' 카테고리의 다른 글

영상 영역 처리  (0) 2023.04.19
이진화  (0) 2023.04.17
히스토그램(histogram)  (0) 2023.04.16
픽셀기반 영상처리-산술연산  (0) 2023.04.16
영상처리  (0) 2023.04.16

영상신호 영역처리란?

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

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

디지털 영상에서 각각의 화소는 고정된 위치를 가지며 이 위치는 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

이진화 알고리즘: 임계값 T보다 큰화소는 1, 그렇지 않은 화소는 0으로 바꿈 임계값 결정이 중요함.

히스토그램에서 계곡 부근으로 결정하는 방법(실제 영상에서는 계곡이 아주 많이 나타나서 구현이 쉽지않음)

오츄 알고리즘: 이진화를 최적화 문제로 바라봄. 최적값 t'를 임계값 T로 이용

최적화 문제란 어떤 목적함수를 최소화 또는 최대화하는 변수를 찾는 문제임.

이진화의 경우 목적함수는 이미지의 밝기값 분포를 바탕으로 만들어지며, 임계값이 목적함수를 최소화하거나 최대화하는 값을 찾는것이 목표임.

이때 다시말하자면 이진화란 그레이스케일 이미지에서 임계값을 기준으로 픽셀의 밝기를 두가지 값 중 하나로만 할당하는 과정을 말함. 

이걸 하는 이유는 이 과정을 통해서 이미지의 특정 부분만을 강조하거나, 이미지에서 원하는 객체를 분리하는 목적으로 사용.

 

목적함수 j(t)는 임계값 t의 좋은 정도를 측정함(작을수록 좋음)

t로 이진화했을때 0이되는 화소들의 분산v0(t)과 1이되는 화소들의 분산 v1(t)의 가중치 (n0(t)와 n1(t)) 합을 j로 사용

오츄 알고리즘(python)

 

import cv2 as cv
import sys

img=cv.imread('soccer.jpg')

t,bin_img=cv.threshold(img[:,:,2],0,255,cv.THRESH_BINARY+cv.THRESH_OTSU)
print('오츄 알고리즘이 찾은 최적 임곗값=',t)
#이 코드에서는 img의 파란색 체널(인덱스2)을 가져와서 cv.threshold()함수를 사용하여 오츄알고리즘을
#적용하고있음 cv.threshold()함수는 인자를 가지는데
#첫번째 인자: 입력이미지의 채널(이 코드에서는 인덱스2라 파란색 채널임)
#두번째 인자: 임계값의 초기값(여기선 0)
#세번째 인자: 임계값의 최댓값(여기선 255)
#네번째 인자: 임곗값 적용 방법(여기서는 cv.THRESH_BINARY+cv.THRESH_OTSU)
#cv.THRESH_BINARY는 이진화 방법중 하나로 픽셀값이 임곗값보다 크면 255 작으면 0으로 설정
#cv.THRESH_OTSU는 오츄 알고리즘을 적용하여 최적의 임곗값을 찾아줌
#cv.threshold 함수를 통해 오츄 알고리즘이 최적의 임곗값 t를 찾아내고 이를 변수 t에 저장함,
#마지막으로 t값을 출력하여 최적의 임곗값을 확인할수 있슴.
cv.imshow('R channel',img[:,:,2])
cv.imshow('R channel binarization',bin_img)

cv.waitKey()
cv.destroyAllwindows()

 

오츄 알고리즘은 최적화를 구현하는데 낱낱 탐색 알고리즘을 사용함.

 

매개변수 t가 해공간을 구성하는데,해공간이 작아서 낱낱 탐색이 가능함

L이 256이라면 해공간은 (0,1,2,....,255)

오츄알고리즘에서 사용하는 낱낱탐색 알고리즘은 가능한 모든 임계값을 대상으로 반복적인 계산을 수행하는 알고리즘임.

이 알고리즘은 이미지에서 가능한 모든 임계값에 대해 반복적으로 계산을 수행함. 이때 임계값은 이미지의 픽셀 밝기 값 분포에서 선택됨. 예를들어, 0부터 255까지 모든 값에 대해 각각 임계값으로 선정하여 클래스간 분산과 클래스 내 분산을 계산함. 이후 계산된 분산 값들중 최소값을 찾아서 해당 임계값을 선택함 -> 이렇게 선택된 임계값을 기준으로 이미지를 이진화함.

이 알고리즘은 가능한 모든 임계값을 대상으로 반복적인 계산을 수행하기 때문에 계산 비용이 매우큼

-> 따라서 큰 이미지에 대해서는 처리 시간이 매우 오래걸릴수있음 그러나 이 알고리즘은 이미지 이진화 문제를 해결하는데 있어서 정확한 결과를 보장해줌

 

근데 컴퓨터 비전은 문제를 최적화로 푸는 경우가 많은데 이건 해공간이 너무 커서 낱낱 탐색이 불가능함 그래서 최적해가 아니라 부최적해를 찾는 효율적인 알고리즘을 사용함.

스네이크(물체 외곽선을 찾는 알고리즘)는 탐욕 알고리즘 사용

역전파 알고리즘(기계학습을 위해 미분하는 알고리즘)은 미분 사용

 

 

 

'computer_vision' 카테고리의 다른 글

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

히스토그램은 영상의 명암값 프로필을 보여주기 위해 사용합니다.

이러한 히스토그램은 데이터의 분포를 시각화하는 그래프중 하나로, 데이터의 빈도를 나타내는 도표입니다.

데이터를 구간으로 나누고 각 구간에 속하는 데이터의 빈도를 막대 형태로 표현합니다. 이러한 히스토그램은 데이터의 분포를 파악하고 데이터의 특성을 이해하는데 도움이 됩니다.

히스토그램 평활화: 히스토그램이 평평하게 되도록 영상을 조작해 영상의 명암 대비를 높이는 기법

히스토그램 평활화는 이미지 처리 기술중 하나로, 이미지의 히스토그램을 변환하여 이미지의 대비를 향상시키는 과정을 말합니다. 이미지의 밝기 분포를 재조정하여, 어두운 영역과 밝은 영역의 대비를 높여 이미지의 시각적 품질을 향상시키는 목적으로 사용됩니다.

 

영상의 분포도 평활화

누적 정규화 히스토그램은 다음과 같은 과정을 통해 계산됩니다.

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

영상 처리 연산에는 세종류가 있습니다. 이 세종류를 분류하는데에는 화소가 새로운 값을 어디서 받느냐에 따라 세가지로 구분합니다.

점연산: 자기 자신에게서 받음

영역 연산: 이웃 화소들에서 받음

기하 연산: 기하학적 변환이 정해주는 곳에서 받음

포인터처리: 개별 화소를 독립적으로 처리하는 연산

포인터 처리

산술연산(c언어로 구현하였을때)

산술연산 - 클리핑 처리

 

if (OutImage[i][j] > 255)
OutImage[i][j] = 255;
if (OutImageImage[i][j] < 0)
OutImage[i][j] = 0;

첫번째 if문은 outimage 배열의 i행 j열에 위치한 픽셀갑ㅄ이 255보다 크면 해당 픽셀값을 255로 설정합니다 이는 픽셀값이 255를 초과하지 않도록 클리핑하는 역할을 합니다. 픽셀값이 255를 초과할경우 이미지나 영상에서 픽셀값의 범위를 0부터 255로 제한하여 넘치지않도록 조정하는것이 클리핑 처리 입니다.

마찬가지로 두번째 if문은 outimage배열의 i행 j열에 위치한 픽셀값이 0보다 작으면 해당 픽셀값을 0으로 설정합니다 이러한 클리핑 처리는 이미지나 영상 처리에서 일반적으로 사용되는 작업 중 하나로, 이미지나 영상의 픽셀값이 정해진 범위를 초과하지않도록 조정하여 올바른 픽셀값의 범위를 유지하고, 이미지나 영상의 품질을 향상시키는데 활용될 수 있습니다.

 

원본영상에서 산술연산중 덧셈연산을 통하여 픽셀값에 임의의 상수값을 더해준다면 이미지는 더 밝아지고 뺄셈연산을 통하여 원본의 픽셀값에서 임의의 상수값을 빼준다면 더 어두워집니다.

하지만 이러한 방법보다 원본영상에 임의의 상숫값을 곱해주는 상수 곱 처리 연산을 행하여 준다면 덧셈 연산을 수행하는 것보다 화질이 더 좋게 밝기가 조정이 됩니다.

위- 상수 합 처리 밑- 상수 곱 처리

산술연산 - negative처리

산술식: f(x)=255-x

원본 픽셀값을 255에서 빼주는 산술 연산입니다.

 

이 영상 포인터 처리를 c언어로하여서 구현을 해보겠습니다.

int val;
printf("변화값 입력: ");
scanf("%d", &val);
//입력받은 변화값을 선언한 변수 val에 널어주기
for(int i=0; i<imgSize; i++)
	if(image[i]+val > 255) output[i]=255;
    else if(image[i]+val<0) output[i]=0;
    else output[i]=image[i]+val;
	//아까 입력받은 변화값을 직접 원본의 픽셀값에 덧셈연산을 해줌으로써 상수 합처리의 밝기변화를 해줌
    //이때 픽셀값이 0부터255범위를 벗어나지않도록 클리핑처리를 해주기

//대비 변화
double val;
printf("실수 값 입력: ");
scanf("%lf", &val);
for(int i=0; i<imgSize; i++)
	if(image[i]*val> 255.0) output[i]=255;
    else output[i] = (BYTE)(image[i]*val);
 	//실수값을 입력받아서 입력받은 값을 원래 원본 픽셀값에 상수 곱처리를 해줌으로써 대비 변화를 해줌


//영상 반전
for(int i=0; i<imgSize; i++)
	output[i] = 255 - image[i];
    //아까봤던 negative처리를 해줌으로써 영상 반전을 시켜줌

 

파이썬으로 영상을 명암 영상으로 변환하고 반으로 축소하기

import cv2 as cv
import sys

img=cv.imread('soccer.jpg')

if img is None:
	sys.exit('파일을 찾을 수 없습니다.')
    
gray=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#RGB 컬러 영상을 명암 영상으로 변환
gray_small=cv.resize(gray,dsize=(0,0),fx=0.5,fy=0.5)
#반으로 축소

cv.imwrite('soccer_gray.jpg',gray)
cv.imwrite('soccer_gray_small.jpg',gray_small)
#영상을 파일에 저장하기 앞에는 저장할 파일명
cv.imshow('Color image',img)
cv.imshow('gray image',gray)
cv.imshow('gray image small',gray_small)

cv.waitKey()
cv.destroyAllwindows()

 

cvtColor 함수가 컬러영상을 명암 영상으로 바꾸는 방법

 

grb에 특정한 값을 곱해
각각 픽셀을 접근해서 명암 영상으로 바꿈

 

선형 연산
비선형 연산

 

파이썬으로 명암조절하기

import cv2 as cv
import numpy as np

img=cv.imread('soccer.jpg')
img=cv.resized(img,dsize=(0,0),fx=0.25,fy=0.25)
#cv.resize()함수는 이미지를 크기 조정하는 함수로 여러 매개변수를 사용합니다
#img:입력 이미지, dsize:출력 이미지의 크기를 지정하는 튜플(width,height)또는 크기를 지정하지않는(0,0)
#fx:가로 방향으로의 크기 비율 fy:세로 방향으로의 크기 비율
#이 코드에서는 (0,0)으로 설정하여 출력 이미지의 크기를 설정하지않고 fx와fy를 각각0.25로 설정하여
#가로와 세로 방향으로 0.25배로 이미지를 축소하고있습니다 이를통해 이미지를 4분의1로 축소하고 결과이미지를 
#img라는 변수에 저장하고있음.

def gamma(f,gamma=1.0):
	f1=f/255.0
    return np.unit8(255*(f1**gamma))
#gamma함수는 두개의 매개변수 f와 gamma를 입력으로 받음
#f: 입력 이미지 또는 배열
#gamma: 감마 값을 나타내는 파라미터로 기본값은 1.0임
#함수 내부에서 우선 입력 이미지 f를 0부터 1까지 범위로 정규화하기위해 f1변수를 생성하여 f를 255.0으로 나누어
#정규화를 시킴 그 후 f1에 gamma값을 제곱하여 감마값을 적용한뒤 다시 255를 곱하여 0부터 255까지의 범위로 변화
#마지막으로 np.unit8()함수를 사용하여 값의 자료형을 8비트 부호없는 정수로 변환하여 반환함

gc=np.hstack((gamma(img,0.5),gamma(img,0.75),gamma(img,1.0),gamma(img,2.0),gamma(img,3.0)))
#이 코드는 img라는 이미지에 대해 감마값에 대한 감마 보정을 수행한뒤 그 결과를 가로로 연결하여
#np.hstack()함수를 사용하여 gc라는 배열에 저장하는것임

cv.waitKey()
cv.destoryAllwindows()

 

'computer_vision' 카테고리의 다른 글

이진화  (0) 2023.04.17
히스토그램(histogram)  (0) 2023.04.16
영상처리  (0) 2023.04.16
colormap  (0) 2023.04.16
computervision  (0) 2023.04.15

영상처리: 특정 목적을 달성하기 위해 원래 영상을 개선된 새로운 영상으로 변환하는 작업

화질 개선 자체가 목적인 경우: 도주 차량의 번호판 식별, 병변 위치 찾기 등

컴퓨터 비전은 전처리로 활용하여 인식 성능을 향상

 

영상을 획득하고나면 디지털로 변환함 

MxN영상으로 샘플링

L단계로 양자화

 

디지털 영상의 좌표계에서는 왼쪽 위 구석이 원점임

 

컬러 모델

컬러모델은 특정상황에서 컬러의 특징을 설명하기 위한 방법

하나의 컬러 모델을 사용하여 컬러의 모든 성질을 설명하기엔 불가능

색좌표계들은 보통 세가지 요소를 사용하여 색을 표현하기때문에  각각의 요소를 하나의 축으로 하는 3차원 좌표 시스템에 대응

RGB컬러 모델
HSV컬러모델

HSV컬러모델은 RGB보다 빛 변환에 강건함.

 

RGB칼라 영상임

위 사진에서 A는 24비트의 칼라영상 B는 R만의 영상 C는 G만의 영상 D는 B만의 영상임

그럼 이 사진을 RGB채널별로 디스플레이하는것을 한번 해볼것임.

import cv2 as cv
import sys

img=cv.imread('soccer.jpg')

if img is None:
	sys.exit('파일을 찾을 수 없습니다.')
   
cv.imshow('original_RGB',img)
cv.imshow('Upper left half',img[0:img.shape[0]//2,0:img.shape[1]//2,:])
#이 코드 부분은 원본 이미지의 높이를 2로 나눈 값과 너비를 2로 나눈 값으로 이미지를 자르는 부분임
#즉 원본이미지의 상단 절반 왼쪽 부분만 표시됨.
#좀 더 자세히 설명을 하자면 img.shape는 img배열의 형태(높이,너비,체널)를 나타내는 속성인데
#여기서 img.shape[0]은 이미지의 높이, img.shape[1]은 이미지의 너비를 나타냄
#:라는것은 모든것을포함한다는 뜻으로 모든 체널을 포함한다는 얘기가됌
cv.imshow('Center half',img[img.shape[0]//4:3*img.shape[0]//4,img.shape[1]//4:3*img.shape[1]//4,:])
#아까 말했던것처럼 img.shape[0]은 이미지의 높이 img.shape[1]은 이미지의 너비를 나타냄 
#img.shape[0]//4는 이미지의 높이를 4로 나눈 값이고 3*img.shape[0]//4는 이미지 높이를 4로 나눈 값에
#3을 곱한값임 그러니가 이미지 높이의 1/4부터 3/4까지의 영역을 선택함 마찬가지로 이미지의 너비도 똑같이
#1/4영역부터 3/4영역을 선택하였고 맨 뒤에 :표시는 모든 체널을 포함한다는 것이니까 이것은 img의 배열중앙
#부분의 절반을 자르는 부분임 이 창에는 원본이미지의 중앙부분의 절반이 표시될것임
cv.imshow('R channel',img[;,;,2])
cv.imshow('G channel',img[;,;,1])
cv.imshow('B channel',img[;,;,0])
# 이 코드들은 아까 설명했던것과 같이 img[높이,너비,체널]인데 모든 높이와 너비를 선택하여서 원본이미지와
#크기는 똑같을 것이며 맨 뒤에 체널부분에서 RGB에 따른 체널선택에 차별성을 두어서 rgb체널별로 
#디스플레이를함
cv.waitKey()
cv.destroyAllwindows()

 

'computer_vision' 카테고리의 다른 글

히스토그램(histogram)  (0) 2023.04.16
픽셀기반 영상처리-산술연산  (0) 2023.04.16
colormap  (0) 2023.04.16
computervision  (0) 2023.04.15
OpenCv  (0) 2023.04.15

몇몇 그래픽스 디스플레이 시스템들은 화소당 1또는 2바이트의 저장 공간만을 할당 -> 화소당 3바이트를 요구하는 컬러영상을 디스플레이할때 문제가 발생 -> colormap으로 해결할수있음

16.7만(224)컬러 -> 256(28) 또는 65,53(216)컬러로 줄이기  위한 참조 테이블

 

24비트 칼라 영상

640x480의 24비트 칼라영상은 압축을 하지 않을경우 921.6byte(=640x480x3)의 저장공간이 필요함(칼라라 rgb3곱해서)

24비트 칼라영상이 각 화소마다 특수효과 정보를 나타내는값(예:투명도)를 저장하기 위한 여분의 바이트를 포함하고있어서 실제로는 32비트 영상으로 저장.

공간적인 문제로 인해 많은 시스템은 화면 영상을 만들어 내는데 8비트의 칼라정보(소위 256컬러)만을 사용하도록 만들 수 있음.

->칼라 정보를 저장하기 위한 칼라 참조표사용

 

컬러맵은 컴퓨터 비전에서 이미지나 비디오의 픽셀값을 특정한 색상으로 매핑하는 기술입니다.

컬러맵은 보통 픽셀값을 입력으로 받아서 해당 픽셀값이 가리키는 컬러 값을 출력으로 반환합니다.

컬러맵은 다양한 방식으로 구성될 수 있으며, 선형적인 매핑, 비선형적인 매핑, 색상간의 보건, 그라데이션, 컬러 테이블등 다양한 방식으로 픽셀값을 색상으로 변환할 수 있습니다.

 

컬러맵의 동작과정

1. 이미지나 비디오에서 픽셀값을 추출합니다.

2. 추출한 픽셀값은 컬러맵의 입력으로 사용됩니다.

3. 컬러맵은 입력된 픽셀값에 대응하는 색상 값을 찾습니다.

4. 찾은 색상 값을 이미지나 비디오에 적용하여 시각화하거나 다른 처리를 수행합니다.

 

 

256 컬러(8비트) 팔레트를 이용한 비트맵 컬러 영상표현

256컬러(8비트)팔레트를 이용한 비트맵 컬러영상은 일반적으로 인덱스 컬러 방식을 사용하여 표현됩니다. 인덱스 컬러는 영상의 각 픽셀에 대해 8비트(1바이트)의 인덱스 값을 할당하여 해당 인덱스 값에 대응하는 컬러를 팔레트에서 찾아 사용하는 방식입니다. 이를 통해 256개의 서로다른 컬러를 표현 할 수 있습니다.

비트맵 이미지의 픽셀은 8비트의 인덱스 값으로 표현되며, 이 인덱스 값은 0부터 255까지의 범위를 가질 수 있습니다. 이 인덱스 값은 팔레트에 저장된 실제 컬러에 대응하며, 팔레트는 256개의 컬러를 저장하는 256x3크기의 테이블로 구성됩니다. 각각의 인덱스 값은 해당 컬러를 표현하고, 이를 이용하여 비트맵 이미지를 화면에 표시하거나 저장 할 수 있습니다.

 

8비트 칼라영상에 대한 칼라LUT

8비트 칼라영상: 각 화소에 대해 단지 인덱스나 코드값만을 저장(값 25를 저장한 하나의 화소는 단지 칼라 참조표에서 25번째 열을 의미

영상 파일은 단지 각 RGB값을 표현하기 위해서 현재 저장된 8비트값이 각각의 인덱스가 된다는 사실만을 그 영상의 헤더 정보에 저장 

LUT를 흔히 팔레트하는 용어로 사용하기도함.

 

디지털 영상파일 형식

영상파일 구조

 

'computer_vision' 카테고리의 다른 글

히스토그램(histogram)  (0) 2023.04.16
픽셀기반 영상처리-산술연산  (0) 2023.04.16
영상처리  (0) 2023.04.16
computervision  (0) 2023.04.15
OpenCv  (0) 2023.04.15

인간의 시각은 놀라움 우리는 사진 하나를 보고 인식, 추론, 예측, 상상등을 수행함

심지어 더 나아가 사진에있는 어떤 인물이 운동선수라면 선수가 어떤점수를 받을수있을지 까지도 추정가능

시각은 오감 중에서 가장 뛰어남

 

인간 눈의 구조와 동작

동쪽 경로(녹색)은 주로 물체의 움직임, 배쪽 경로(보라색)은 주로 물체의 부류를 알아냄

매 순간, 빠르고 정확하게 그리고 손쉽게 인식함.

 

인간 시각의 강점

분류, 검출, 분할, 추적, 행동 분석에 능숙함(사전 행동에 능숙)

3차원 복원 능력

빠르고 강건: 과업 전환이 매끄럽고 유기적이고 빠름

다른 지능 요소인 지식 표현, 추론,계획과 협동

 

인간 시각의 한계

착시가 있으며 정밀 측정에 오치가 나오고 시야가 한정됨 그리고 피로해지고 퇴화함.

 

why computervision?

컴퓨터 비전은 인간의 시각을 흉내 내는 컴퓨터 프로그램

시각은 인공지능의 중요한 구성요소

현재 컴퓨터 비전 기술로 인간에 필적하는 시각 구현은 불가능하지만 과업을 한정하면 인간 성능에 가깝거나 뛰어넘는 응용이 무궁무진함

사용예시)

과일 수확 드론, 혈관 분할, 자율주행, 불량 검사, 선수의 행동 분석, 고객의 동선 분석 등등

 

이러한 컴퓨터 비전은 왜 어려운가?

환경의 변화(밤 낮 날씨) 보는 위치와 방향의 변화, 강체와 연성 물체

원자부터 우주까지 긴 스펙트럼에서 영상 수집

인공지능의 미숙함: 지식 표현, 추론, 계획, 학습이 유기적으로 동작할 때만 강한 인공지능 가능

강한 인공지능은 먼 미래의 일 또는 영영 불가능

 

컴퓨터 비전의 목표

 

궁극적인 목표:

   일반적인 상황에서 잘 작동하는 인간과 같은 시각(강한 인공지능)

   영영 불가능하거나 먼 미래에 실현

현실적인 목표:

    제한된 환경에서 특정 과업을 높은 성능으로 달성(약한 인공지능)

    컴퓨터 비전 문제를 여러 세부 문제로 구분하고 세부 문제별로 알고리즘 구상

 

멀티미디어: 여러가지 매체(정보를 표현하고 분배하기 위한 수단, 정보를 표현하기 위한 다양한 형태의 매체)

신호처리: 신호(디지털or아날로그)를 처리하는 방법 혹은 알고리즘으로서 각종 정보에 가공을 하여 어떠한 부가가치를 만들어내는 작업, 디지털 신호처리(DSP)는 멀티미디어 신호처리의 기초가 됨.

 

일반적인 디지털 신호처리 구상도

아날로그 입력신호 -> 아날로그 필터 -> 아날로그-디지털 변환기 -> DSP or 컴퓨터 -> 디지털-아날로그 변환기 ->아날로그 필터 -> 아날로그 출력 신호

 

디지털 영상처리 vs 컴퓨터 그래픽스

 

디지털 영상처리: 영상처리를 실제의 영상을 조작하는 것

전형적으로 2차원 데이터로 제한되지만, 의한 진단 분야의 경우 3차원 데이터도 수행

컴퓨터 그래픽스: 컴퓨터 프로그램에 의한 합성 영상을 생성하는 것 

2차원과 3차원 물체를 가지고 작업

 

디지털 영상의 내부

 

영상의 파일 사이즈

예시) MxN (640 x 480)

흑백영상: 각 픽셀당 8비트 (256의 밝기값): 640x480x8(bit) = 640x480 byte

컬러영상: 640x480x8x3(bit) 컬러는 RGB로 색을 표현해여하기때문에 곱하기 3을 해줘야함

 

 

디지털 영상파일 형식

현재 가장 널리 사용되는 영상파일 형식은 JPG와 BMP영상 파일

영상 파일 구조

 

'computer_vision' 카테고리의 다른 글

히스토그램(histogram)  (0) 2023.04.16
픽셀기반 영상처리-산술연산  (0) 2023.04.16
영상처리  (0) 2023.04.16
colormap  (0) 2023.04.16
OpenCv  (0) 2023.04.15

+ Recent posts