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

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

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

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

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

포인터 처리

산술연산(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

+ Recent posts