일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- Image Processing
- Widget
- Dreamhack
- DART
- 백준
- Got
- BAEKJOON
- system hacking
- MATLAB
- rao
- BOF
- Kaggle
- PCA
- Algorithm
- bloc
- pytorch
- MDP
- llm을 활용 단어장 앱 개발일지
- Computer Architecture
- study book
- 영상처리
- fastapi를 사용한 파이썬 웹 개발
- ML
- BFS
- Flutter
- Stream
- ARM
- FastAPI
- 파이토치 트랜스포머를 활용한 자연어 처리와 컴퓨터비전 심층학습
- C++
- Today
- Total
Bull
[Image Processing] Gaussian and Butterworth Notch Filter 본문
[Image Processing] Gaussian and Butterworth Notch Filter
Bull_ 2024. 5. 8. 15:03과제
우선 학교 과제로 한건데, 자료도 없고,,, 지식도 없어서 GPT한테 땡깡 부리면서 만들었다.
정확히 맞는 건지는 모르지만 대략적으로 적용된 거 같아서 포스팅으로 남긴다.
요구 사항
우선 "무아레 패턴"이 들어간 자동차 앞부분 사진이다.
이 패턴을 FFT를 통해 주파수 스펙트럼을 확인하면 다음과 같다.
여기서 흰 것이 쌜수록 에너지가 크다. 그 부분이 잡음에 해당된다.
Filter를 통해 흰 부분은 어둡게 가려주면 잡음이 어느정도 사라진다.
x = fftshift(fft2(im));
xout = log(1+abs(x));
imshow(xout, []);
위 코드로 주파수 스펙트럼을 확인할 수 있다.
이제 Gaussian 과 Butterworth의 공식을 적용해서 바꾸면 된다.
Gaussian Notch Reject Filter
Butterworth Notch Reject Filter
pass filter는 1-reject 해주면된다.
주파수 스펙터럼에 적용시키면 대락적으로 이렇게 된다.
Gaussian Notch reject filter에서 $D_0$는 어두운 정도의 계수가 된다.
너무 크게 하면 번지는 듯한 필터가 되버리고 사진이 어둡게 변한다.
ButterWorth는 깔끔하게 적용되는데 Gaussian은 제대로 적용시키려면 어떤 수식을 넣어야 할 지 모르겠다.
notch
여기서 notch 부분은 식을 한 번만 적용하면 2개가 찍히는데 좌표는 임의로 찍어야 한다.
수식으로 찾아낼 수도 있지만 어떻게 하는 지 몰라서 브루트포스(찍기) 방법으로 하는 방법도 있다고 교수님이 말씀해주셨다.
그리고 notch를 여러개 하고 싶으면 식에 더하거나 곱을 하는 방법이 있다.
좌표(u, v)?
이건 사실 이해 못했다. 어쩌면 이것을 제대로 바꿔주면 Gaussian Filter가 제대로 적용될 거 같은 생각을 하긴했는데 우선 적용만 시키면 과제 완성이기 때문에 시간 내 완벽하게 못했지만 어쩔 수 없이 제출했다.
수식에 적용되는 것을 보면 이미지를 주파수 영역으로 바꿔놓은 좌표값이 아닐까 생각이 든다.
결과
실제로 해보니 되게 신기했다.
surf로 확인해보면 Butterworth는 기둥처럼 생겼고 Gaussian은 물갈퀴처럼 매끄럼게 솟았다.
reject filter된 이미지는 확실히 체크무늬가 많이 사라진 모습을 볼 수 있었다.
하지만 Gaussian은 많이 어둡고 덜 적용된 듯한 느낌때문에 완벽하지 않다는 생각을 안할 수가 없었다.
passed filter는 체크무늬가 더 강조된 모습을 볼 수 있다. 잡음을 더 강하게 통과시켰기 때문이다.
Code
clear;
clc;
im = imread('moire.jpg');
im = uint8(mean(im, 3));
[r, c] = size(im);
notchPositions = [26.5, -42.5; 26.5, 39.1; 27, 71; 26.5, -82.1];
[U, V] = meshgrid(1:c, 1:r);
U = U - round(c/2);
V = V - round(r/2);
% Gaussian Notch Reject Filter
H1 = ones(r, c);
D0 = 30;
for i = 1:size(notchPositions, 1)
u0 = notchPositions(i, 1);
v0 = notchPositions(i, 2);
D1 = sqrt((U - u0).^2 + (V - v0).^2);
D2 = sqrt((U + u0).^2 + (V + v0).^2);
H1 = H1 .* (1 - exp(-0.5 * ((D1 .* D2) / D0^2)));
end
% Gaussian Notch Pass Filter
H2 = ones(r, c);
D0 = 20;
for i = 1:size(notchPositions, 1)
u0 = notchPositions(i, 1);
v0 = notchPositions(i, 2);
D1 = sqrt((U - u0).^2 + (V - v0).^2);
D2 = sqrt((U + u0).^2 + (V + v0).^2);
H2 = H2 + (exp(-0.5 * ((D1 .* D2) / D0^2)));
end
fftim = fft2(im);
imf = fftshift(fftim);
mtrans1 = imf .* H1;
mtrans2 = imf .* H2;
out1 = abs(ifft2(ifftshift(mtrans1)));
out2 = abs(ifft2(ifftshift(mtrans2)));
subplot(2, 7, 1);
imshow(im, []);
title('Original Image');
subplot(2, 7, 2);
imshow(log(1 + abs(H1)), []);
title('Gaussian Notch Reject Filter');
subplot(2, 7, 3);
surf(U, V, log(1 + abs(H1)));
title('Gaussian Notch Reject Filter Surf');
xlabel('U');
ylabel('V');
zlabel('Magnitude');
subplot(2, 7, 4);
imshow(out1, []);
title('Filtered Image');
subplot(2, 7, 5);
imshow(log(1 + abs(H2)), []);
title('Gaussian Notch Pass Filter');
subplot(2, 7, 6);
surf(U, V, log(1 + abs(H2)));
title('Gaussian Notch Pass Filter Surf');
xlabel('U');
ylabel('V');
zlabel('Magnitude');
subplot(2, 7, 7);
imshow(out2, []);
title('Passed Image');
[r, c] = size(im);
notchPositions = [26.5, -42.5; 26.5, 39.1; 27, 71; 26.5, -82.1];
D0 = 35;
[U, V] = meshgrid(1:c, 1:r);
U = U - round(c/2);
V = V - round(r/2);
% Butterworth Notch Reject Filter
H3 = ones(r, c);
n=100
for i = 1:size(notchPositions, 1)
u0 = notchPositions(i, 1);
v0 = notchPositions(i, 2);
D1 = sqrt((U - u0).^2 + (V - v0).^2);
D2 = sqrt((U + u0).^2 + (V + v0).^2);
H3 = H3 .* (1 ./ (1 + (D0^2 ./ (D1 .* D2)).^n));
end
% Butterworth Notch Pass Filter
H4 = ones(r, c);
n = 100;
for i = 1:size(notchPositions, 1)
u0 = notchPositions(i, 1);
v0 = notchPositions(i, 2);
D1 = sqrt((U - u0).^2 + (V - v0).^2);
D2 = sqrt((U + u0).^2 + (V + v0).^2);
H4 = H4 + (1-(1 ./ (1 + (D0^2 ./ (D1 .* D2)).^n)));
end
fftim = fft2(im);
imf = fftshift(fftim);
mtrans3 = imf .* H3;
mtrans4 = imf .* H4;
out3 = abs(ifft2(ifftshift(mtrans3)));
out4 = abs(ifft2(ifftshift(mtrans4)));
subplot(2, 7, 8);
imshow(im, []);
title('Original Image');
subplot(2, 7, 9);
imshow(log(1 + abs(H3)), []);
title('Butterworth Notch Reject Filter');
subplot(2, 7, 10);
surf(U, V, log(1 + abs(H3)));
title('Butterworth Notch Reject Filter Surf');
xlabel('U');
ylabel('V');
zlabel('Magnitude');
subplot(2, 7, 11);
imshow(out3, []);
title('Filtered Image');
subplot(2, 7, 12);
imshow(log(1 + abs(H4)), []);
title('Butterworth Notch pass filter imshow');
subplot(2, 7, 13);
surf(U, V, log(1 + abs(H4)));
title('Butterworth Notch pass filter surf');
xlabel('U');
ylabel('V');
zlabel('Magnitude');
subplot(2, 7, 14);
imshow(out4, []);
title('Passed Image');
'Computer Science > Image Processing' 카테고리의 다른 글
[Image Processing] Banded Notch Filter (0) | 2024.05.08 |
---|---|
[Image Processing] Histogram Equalization (by MATLAB) (1) | 2024.03.23 |
[Image Processing] Bit-Plane Slicing (8bit slicing) (by MATLAB) (0) | 2024.03.21 |
[Image Processing] Piecewise linear transformation(구간별 선형 변환) (by MATLAB) (0) | 2024.03.21 |
[Image Processing] 명도변환 (Power-Law Transformations)하기 (by MATLAB) (0) | 2024.03.19 |