์ ๋ฒ ํฌ์คํ ์์ Low pass filter์ High pass filter๊ฐ ๋ฌด์์ธ์ง, ์ด๋ค๊ฒ์ด ์๋์ง์ ๋ํด์ ์์๋ณด์๋ค.
์ด๋ฒ์๋ ์ด ํํฐ๋ค์ ์ด์ฉํด์ ์ด๋ฏธ์ง๋ฅผ ์กฐ๊ธ ๋ ์ ๋ช ํ๊ฒ ๋ฐ๊พธ๋ Unsharp Masking์ ๋ํด์ ์์๋ณด์
https://he-kate1130.tistory.com/139
[Computer Vision/OpenCV] 10. Spatial Filtering & Convolution ๊ฐ๋
์ง๋์๊ฐ์๋ ์ด๋ฏธ์ง์ ํ์คํ ๊ทธ๋จ์ ์ด์ฉํด ํฝ์ ๊ฐ๋ค์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ๋ค์ ์ ๋ฆฌํ๋ค.์ค๋๋ถํฐ๋ ์ด๋ฏธ์ง์ spatial data๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ์๋ค์ ๋ํด์ ์ ๋ฆฌํ๋ค.์ด๋ฏธ์ง์ ๊ณต๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์
he-kate1130.tistory.com
Unsharp Masking
์ด๋ฏธ์ง๋ฅผ ์ ๋ช ํ๊ฒ ํ๊ธฐ ์ํ ๊ธฐ๋ฒ์ ๋งํ๋ค.
lowpass filter๋ฅผ ํ์ฉํด์ ์๋ณธ์ด๋ฏธ์ง์ ์ ์ฃผํ ์ฑ๋ถ์ ์ถ์ถํ๊ณ , ์๋ณธ์์ ์ด ์ ์ฃผํ๋ฅผ ์ ๊ฑฐํ๋ค.
๊ฐ๋จํ ์ดํด๋ฅผ ๋๊ธฐ ์ํด Unsharp Masking๊ณผ์ ์ ๊ทธ๋ฆผ์ผ๋ก ํํํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.

ํต์ฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ธ๋ฌ๋ฅผ ํตํด ์ ์ฃผํ ์ ๋ณด๋ฅผ ์ป์ด๋ด๊ณ
์ด ์ ์ฃผํ ์ ๋ณด์ ์ ์ ํ weight k๋ฅผ ์ ์ฉํ์ฌ ์๋ณธ์์ ๋นผ์ค๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๊ฒฐ๊ณผ๋ก k ๋งํผ์ ์ ์ฃผํ ์ ๋ณด๊ฐ ์ฌ๋ผ์ง๊ณ , ๊ณ ์ฃผํ ์ ๋ณด๊ฐ ๊ฐ์กฐ๋๊ฒ ๋๋ค.
k ๋งํผ ์ ์ฃผํ ์ ๋ณด๊ฐ ๋น ์ก๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ์ง์ intensiy๋ฅผ ๋ค์ ๋ณต์ํด์ผ ํ๋ค.
์ด๋ฅผ ์ํด์ (1-k)๋ก ๋๋์ด ์ค์ผ์ผ๋งํ๋ฉด ๊ณผ์ ์ด ๋๋๋ค.
OpenCV C++ Code
๊ฐ ๋จ๊ณ๋ณ๋ก ์ด๋ฏธ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
๋จผ์ ์๋ณธ ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ฐ์์ ํํฐ๋ฅผ ์ ์ฉํ์ฌ ๋ธ๋ฌ ์ฒ๋ฆฌ ํ๋ค.


์ดํ ๊ฐ์ค์น k ๋ฅผ 0.75๋ก ๋๊ณ ๋ธ๋ฌ ์ด๋ฏธ์ง๋ฅผ ์ค์ผ์ผ๋ง ํ๋ค.
์๋ณธ์์ ์ค์ผ์ผ๋ ์ด๋ฏธ์ง๋ฅผ ๋นผ์ฃผ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ด๋ก์ง๋ง, ๊ณ ์ฃผํ ์ ๋ณด๊ฐ ๊ฐ์กฐ๋ ์ด๋ฏธ์ง๋ฅผ ์ป๊ฒ ๋๋ค.

๋ค์ ์ด๋ฏธ์ง์ intensity๋ฅผ ์ค์ผ์ผ๋ง ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํ๋ ๋ ์ด๋ฏธ์ง๋ฅผ ์ป๋๋ค.

์ฌ์ฉ๋ ์ฝ๋๋ ์๋์ ๊ฐ๋ค. ์ฝ๋์ ์๋ ๋ถ๋ถ์ ์ฌํํ๊ฒ Unsharp Masking๋ง ํ๋ ์ฝ๋๋ ํจ๊ป ์ ์๋ค.
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main() {
//์ด๋ฏธ์ง ํ์ผ์ ์ฝ์ด์จ๋ค.
Mat img = imread("lena.jpg", IMREAD_GRAYSCALE);
if (img.empty()) {
std::cout << "Could not open or find the image" << std::endl;
return -1;
}
// 0. ์ด๋ฏธ์ง ์ ๊ทํ: ์ํํ unsharp masking์ ์ํด floatํ์ผ๋ก ๋ณํ
img.convertTo(img, CV_32F, 1.0 / 255.0);
// 1. ์ด๋ฏธ์ง๋ฅผ lowpass filter๋ก ์ฒ๋ฆฌํ๋ค.
Mat img_blurred;
GaussianBlur(img, img_blurred, Size(3, 3), 0);
// 2. scale with k<1
Mat blurred_scaled;
float k = 0.75;
img_blurred.convertTo(blurred_scaled, CV_32F, k);
// 3. subtract
Mat img_subtracted;
subtract(img, blurred_scaled, img_subtracted);
// 3. scale for display
Mat img_scaled;
img_subtracted.convertTo(img_scaled, CV_32F, 1/(1-k));
// ๊ฐ๋จ ๋ฒ์
Mat simple_blurred;
GaussianBlur(img, simple_blurred, Size(3, 3), 0);
Mat simple_unsharp = (img - k * simple_blurred) * (1 / (1 - k));
//์ด๋ฏธ์ง show
imshow("Original", img);
imshow("Blurred", img_blurred);
imshow("Blurred Scaled", blurred_scaled);
imshow("Subtracted", img_subtracted);
imshow("Scaled", img_scaled);
imshow("Simple Unsharp Masking", simple_unsharp);
waitKey(0);
return 0;
}
'๐ฆAI > Computer Vision' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Computer Vision/OpenCV] 14. Image Denoising (0) | 2025.04.05 |
---|---|
[Computer Vision/OpenCV] 13. Image Noise & Degradation (0) | 2025.04.05 |
[Computer Vision/OpenCV] 11. Spatial Filtering (0) | 2025.04.02 |
[Computer Vision/OpenCV] 10. Spatial Filtering & Convolution ๊ฐ๋ (0) | 2025.03.31 |
[Computer Vision/OpenCV] 9. Histogram Matching (0) | 2025.03.27 |