이번 문제의 경우 수업시간에 교수님께서 해결하는 방법을 모두 가르쳐 주셔서 큰 어려움 없이 할 수 있었다. 그냥 mask를 구하고 계산한 뒤 값을 복사하는 작업과 마지막에 계산되지 않는 부분을 0으로 변경하는 것만 잘 하면 쉽게 해결할 수 있는 문제였던 것 같다. 주어진 이미지 말고 여러 가지 이미지에 추가적으로 더 적용 시켜보아야겠다.
• src : 입력 영상 . 각 채널 별로 처리됨
1차원 가우시안 필터, c++ 가우시안 필터, c++프로그래밍, C++프로그램, Gaussian, opencv 가우시안 필터, 가우시안, 가우시안 스무딩, 가우시안 필터 공식, 가우시안 필터 마스크, 가우시안 필터 소스, 가우시안 필터 시그마, 가우시안 필터 원리, 가우시안 필터 정의, 가우시안 필터란, 보정, 알고리즘, 알고리즘소스, 영상처리, 필터 %gaussian filter rad = floor(5 / 2); [a, b] = meshgrid(-rad:rad, -rad:rad); sigma = 2; kernel = (1/(2*pi*(sigma.^2)))*exp(-1 * (a.^2 + b.^2)./ (2*sigma*sigma) ); kernel = kernel / sum(kernel(:)); %합계가 1이 되도록 환산함 이 행렬을 이제 이미지에 컨볼류션 하면 될 것이다. (출처 : https://www.imageeprocessing.com/2015/11/convolution-in-matlab.html) 이미지 컨볼루션은 위와 같다. 설명이 깔끔하게 되어있어서 가져왔다. 쉽게 설명하자면 우리가 만든 5*5행렬을 이미지에 맞춰 해당 픽셀 주위 5*5만큼 곱한 후 다시 해당 픽셀에 집어넣는 과정이다. 컨볼루션 하기 전에, 이미지에 적절히 노이즈를 첨부한다. 첨부하는 이유는 가우시안 필터링을 적용할 때 노이즈가 어느정도 지워졌는지 확인하기 위해서이다. 이미지를 로드하고, 노이즈를 첨부하는 코드는 다음과 같다. %load image image = (imread('wtf.png')); image = rgb2gray(image); [x, y] = size(image); %noise image noise_value = 30; noise = randn([x,y]) * noise_value; noised_image = uint8(double(image) + 0.5 * noise); 이제 noised_image에 컨볼루션을 적용한다. 두가지의 방법이 있는데 그중 한개는 conv2함수를 이용하는 것이다, filtered = conv2(noised_image, z, 'same'); 그냥 이렇게 하면 noised image에 가우시안함수 z를 컨볼루션해 자동으로 filtered image에 들어간다. 하지만 for문으로 직접 연산을 해 집어넣으려면, for i = 1 : x - (size - 1) for j = 1 : y - (size - 1) temp = (double(noised_image(i : i + (size - 1), j : j + (size - 1)))).*z; filtered(i,j) = sum(temp(:)); end end 이렇게 코드를 작성하면 각 픽셀마다 컨볼루션을 적용하여 들어갈 것이다. 이렇게 해서 만들어진 전체 코드는 clear %% load image image = (imread('lena.png')); image = rgb2gray(image); % image = image(:,:,1); [x, y] = size(image); rad = floor(5 / 2); %% noise image noise_value = 30; noise = randn([x,y]) * noise_value; noised_image = (double(image) + 0.5 * noise); %% gaussian filter [a, b] = meshgrid(-rad:rad, -rad:rad); sigma = 2; kernel = (1/(2*pi*(sigma.^2)))*exp(-1 * (a.^2 + b.^2)./ (2*sigma*sigma) ); kernel = kernel / sum(kernel(:)); noised_image = double(noised_image); gaussian_filtered = conv2(noised_image, kernel, 'same'); %% output subplot(1,3,1); imshow(image); title('raw'); subplot(1,3,2); imshow(uint8(noised_image)); title('noised'); subplot(1,3,3); imshow(uint8(gaussian_filtered)); title('gaussian'); |