๋ ์ด๋ฏธ์ง๊ฐ ํฝ์ ์ ํ๊ท ๊ฐ ๊ตฌํ๊ธฐ
๋ ์ด๋ฏธ์ง๊ฐ ํฝ์ ์ ๋ํ ๊ฐ ๊ตฌํ๊ธฐ
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
- Mat ๊ฐ์ฒด ์ด๊ธฐํ
- height, width ์์ (ํฌ๊ธฐ๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ ์ฃผ์)
- CV_8UC1 : 1์ฑ๋, ๊ทธ๋ ์ด
- "addImage.jpg" : ๋ง๋ค ํ์ผ๋ช
- addOut : ํ์ผ๋ก ๋ง๋ค Mat ๊ฐ์ฒด
add Image ๊ฒฐ๊ณผ >
๋ ์ด๋ฏธ์ง๊ฐ ํฝ์ ์ ๋บ ๊ฐ ๊ตฌํ๊ธฐ
#include <opencv2/core/core.hpp>
- abs ํจ์ : ์ ๋๊ฐ ๊ตฌํ๋ ํจ์
- math ํค๋์ ํฌํจ๋์ด ์๋ ํจ์์ง๋ง
- opencv์๋ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋ณ๋๋ก ์ถ๊ฐํ์ง ์์๋ ๋จ
Mean Filter, ํ๊ท ๊ฐ ํํฐ
์ฅ์
- ๋ ์นด๋ก์ด ์์ง๊ฐ ๋ฌด๋์ง๋ค.
- ์ก์์ ์ํฅ์ด ์ฌ๋ผ์ง๋ค.
๋จ์
- ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ด์ ์ด ๋ง์ง ์์ ์ฌ์ง์ฒ๋ผ ๋ณํ๋ค.
1/9 ์ ์๋ฏธ
- ๊ฐ์ค์น๋ ์ ์ฒด์ ํฉ์ 1๋ก ๋ง๋ค์ด์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
- 1๋ณด๋ค ์ปค์ง ๊ฒฝ์ฐ, ๊ฒฐ๊ณผ ์์์ ์ ๋ฐ์ ์ผ๋ก ๋ฐ๊ธฐ ๊ฐ์ด ์ฆ๊ฐ๋๊ณ
- 1๋ณด๋ค ์์ ๊ฒฝ์ฐ, ๋ฐ๊ธฐ ๊ฐ์ด ๊ฐ์๋๋ค.
Weighted mean filter, ๊ฐ์ค ํ๊ท ๊ฐ ํํฐ
ํ๊ท ๊ฐ ํํฐ์ ๋จ์
- ์ฃผ๋ณ ํฝ์ ์ ๊ฐ์ ๋ง์ด ์ฐธ์กฐํ์ฌ ์๋ ์์น์ ํฝ์ ์ ๋ณด๊ฐ ์๋์ ์ผ๋ก ๊ฐ์๋๋ค.
๊ฐ์ค ํ๊ท ๊ฐ ํํฐ
- ํ๊ท ๊ฐ ํํฐ์ ๋จ์ ์ ๋ณด์ํ ๊ฒ
- ํํฐ ๋ง์คํฌ์ ๊ฐ์ด๋ฐ ์์นํ ํฝ์ ์ ๊ฐ์ค์น๋ฅผ ๋ ์ฃผ์ด ์๋ ์์น์ ํฝ์ ์ ๋ณด๋ฅผ ๋ ๊ฐ์์ํจ๋ค.
Gaussian filter, ๊ฐ์ฐ์์ ํํฐ
๊ฐ์ฐ์์ ๋ถํฌ(์ ๊ท ๋ถํฌ)๋ ์์ฐ ํ์์ ๊ฐ์ฅ ์ ํํํ๋ ์ด์์ ์ธ ํ๋ฅ ๋ชจํ์ด๋ค.
ํ๊ท ์ด 0์ด๊ณ , ํ์ค ํธ์ฐจ๊ฐ ฯ์ผ ๋, ํจ์ซ๊ฐ๋ค์ -4ฯ โค x โค +4ฯ ์ฌ์ด์์ ์ ์ฒด ๋ถํฌ์ 99.99%๊ฐ ์กด์ฌํ๋ค.
๊ฐ์ฐ์์ ํจ์๋ ์ฐ์ ํจ์์ด์ง๋ง, ์ด์ฐํ์ ๋ง์คํฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์ x, y ๊ฐ์ด ์ ์์ผ ๋๋ง ์ถ์ถํ์ฌ ๋ง์คํฌ๋ฅผ ๋ง๋ ๋ค.
2์ฐจ์ ๊ฐ์ฐ์์ ํจ์๋ 1์ฐจ์ ํจ์์ ๊ณฑ์ผ๋ก ๋ถํ ํ ์ ์๊ธฐ ๋๋ฌธ์, x, y ๋ฐฉํฅ์ผ๋ก 1์ฐจ์ ๋ง์คํฌ ์ฐ์ฐ์ ๊ฐ๊ฐ ์ํํ์ฌ ๋น ๋ฅด๊ฒ ๊ฒฐ๊ณผ ์์์ ๋ง๋ค ์ ์๋ค.
void gaussianFilter(Mat &image, Mat &out)
{
if (image.channels() != 1)
return;
int mask[5][5] = {
2, 4, 5, 4, 2,
4, 9, 12, 9, 4,
5, 12, 15, 12, 5,
4, 9, 12, 9, 4,
2, 4, 5, 4, 2
};
int sum = 0;
out = image.clone();
for (int y = 2; y < image.size().height - 2; y++)
{
for (int x = 2; x < image.size().width - 2; x++)
{
sum = 0;
for (int m = -2; m <= 2; m++)
{
for (int n = -2; n <= 2; n++)
sum += image.at<uchar>(y + m, x + n)
* mask[m + 2][n + 2];
out.at<uchar>(y, x) = sum / 159.f;
}
}
}
}
- 2020.12.07 ํํฐ์ ๋ํ ๋ด์ฉ ์ถ๊ฐ (2018 ๋์๋ฆฌ ์ธ๋ฏธ๋ ์งํ์๋ฃ)