点击链接→【数字图像处理】简单实践汇总
1. 添加噪声:椒、盐、椒盐、高斯
椒、盐、椒盐噪声比较简单,随机加就行了,可以参考之前的一篇:使用OpenCV自己实现:加噪、平滑、锐化
这里给出高斯噪声的函数:
//高斯噪声
double generateGaussianNoise(double mu, double sigma)
{
const double epsilon = numeric_limits<double>::min();
static double z0, z1;
static bool flag = false;
flag = !flag;
if (!flag) return z1 * sigma + mu;
double u1, u2;
do
{
u1 = rand() * (1.0 / RAND_MAX);
u2 = rand() * (1.0 / RAND_MAX);
} while (u1 <= epsilon);
z0 = sqrt(-2.0 * log(u1)) * cos(2 * CV_PI * u2);
z1 = sqrt(-2.0 * log(u1)) * sin(2 * CV_PI * u2);
return z0 * sigma + mu;
}
Mat addGaussianNoise(Mat& srcImag)
{
Mat dstImage = srcImag.clone();
for (int i = 0; i < dstImage.rows; i++)
{
for (int j = 0; j < dstImage.cols; j++)
{
int val = dstImage.ptr<uchar>(i)[j] + generateGaussianNoise(2, 0.8) * 32;
if (val < 0) val = 0;
if (val > 255) val = 255;
dstImage.ptr<uchar>(i)[j] = (uchar)val;
}
}
return dstImage;
}
2. 调用自己写的函数进行平滑处理
//椒
Mat srcImage_noise_jiao = imread(SRC_IMAGE_NOISE_jiao, 0);
imshow(WIMDOW_NAME_NOISE_jiao, srcImage_noise_jiao);
my_filter_1(srcImage_noise_jiao, "算数均值3*3");
my_filter_2(srcImage_noise_jiao, "几何均值3*3");
my_filter_3(srcImage_noise_jiao, "谐波均值3*3");
my_filter_4(srcImage_noise_jiao, "逆谐波均值3*3");
//盐
Mat srcImage_noise_yan = imread(SRC_IMAGE_NOISE_yan, 0);
imshow(WIMDOW_NAME_NOISE_yan, srcImage_noise_yan);
my_filter_1(srcImage_noise_yan, "算数均值3*3");
my_filter_2(srcImage_noise_yan, "几何均值3*3");
my_filter_3(srcImage_noise_yan, "谐波均值3*3");
my_filter_4(srcImage_noise_yan, "逆谐波均值3*3");
//椒盐
Mat srcImage_noise_jiaoyan = imread(SRC_IMAGE_NOISE_jiaoyan, 0);
imshow(WIMDOW_NAME_NOISE_jiaoyan, srcImage_noise_jiaoyan);
my_filter_1(srcImage_noise_jiaoyan, "算数均值3*3");
my_filter_2(srcImage_noise_jiaoyan, "几何均值3*3");
my_filter_3(srcImage_noise_jiaoyan, "谐波均值3*3");
my_filter_4(srcImage_noise_jiaoyan, "逆谐波均值3*3");
//高斯
Mat srcImage_noise_gaosi = imread(SRC_IMAGE_NOISE_gaosi, 0);
imshow(WIMDOW_NAME_NOISE_gaosi, srcImage_noise_gaosi);
my_filter_1(srcImage_noise_gaosi, "算数均值3*3");
my_filter_2(srcImage_noise_gaosi, "几何均值3*3");
my_filter_3(srcImage_noise_gaosi, "谐波均值3*3");
my_filter_4(srcImage_noise_gaosi, "逆谐波均值3*3");
3. 算数均值
//算术均值
void my_filter_1(Mat src, string window_name)
{
Mat img = src.clone();
for (int i = 1; i < img.rows - 2; i++)
{
for (int j = 1; j < img.cols - 2; j++)
{
img.at<uchar>(i, j) = (src.at<uchar>(i - 1, j - 1)
+ src.at<uchar>(i - 1, j)
+ src.at<uchar>(i - 1, j + 1)
+ src.at<uchar>(i, j - 1)
+ src.at<uchar>(i, j)
+ src.at<uchar>(i, j + 1)
+ src.at<uchar>(i + 1, j - 1)
+ src.at<uchar>(i + 1, j)
+ src.at<uchar>(i + 1, j + 1)) / 9;
}
}
imshow(window_name, img);
}
4. 几何均值
//几何均值
void my_filter_2(Mat src, string window_name)
{
Mat img = src.clone();
for (int i = 1; i < img.rows - 2; i++)
{
for (int j = 1; j < img.cols - 2; j++)
{
img.at<uchar>(i, j) = pow(1.0 * src.at<uchar>(i - 1, j - 1), 1.0 / 9)
* pow(1.0 * src.at<uchar>(i - 1, j), 1.0 / 9)
* pow(1.0 * src.at<uchar>(i - 1, j + 1), 1.0 / 9)
* pow(1.0 * src.at<uchar>(i, j - 1), 1.0 / 9)
* pow(1.0 * src.at<uchar>(i, j), 1.0 / 9)
* pow(1.0 * src.at<uchar>(i, j + 1), 1.0 / 9)
* pow(1.0 * src.at<uchar>(i + 1, j - 1), 1.0 / 9)
* pow(1.0 * src.at<uchar>(i + 1, j), 1.0 / 9)
* pow(1.0 * src.at<uchar>(i + 1, j + 1), 1.0 / 9);
}
}
imshow(window_name, img);
}
5. 谐波均值
//谐波均值
void my_filter_3(Mat src, string window_name)
{
Mat img = src.clone();
for (int i = 1; i < img.rows - 2; i++)
{
for (int j = 1; j < img.cols - 2; j++)
{
img.at<uchar>(i, j) = 9.0 / (1.0 / src.at<uchar>(i - 1, j - 1)
+ 1.0 / src.at<uchar>(i - 1, j)
+ 1.0 / src.at<uchar>(i - 1, j + 1)
+ 1.0 / src.at<uchar>(i, j - 1)
+ 1.0 / src.at<uchar>(i, j)
+ 1.0 / src.at<uchar>(i, j + 1)
+ 1.0 / src.at<uchar>(i + 1, j - 1)
+ 1.0 / src.at<uchar>(i + 1, j)
+ 1.0 / src.at<uchar>(i + 1, j + 1));
}
}
imshow(window_name, img);
}
6. 逆谐波均值
//逆谐波均值
void my_filter_4(Mat src, string window_name)
{
double q = 1.5;
Mat img = src.clone();
for (int i = 1; i < img.rows - 2; i++)
{
for (int j = 1; j < img.cols - 2; j++)
{
img.at<uchar>(i, j) =
(pow(src.at<uchar>(i - 1, j - 1), q + 1)
+ pow(src.at<uchar>(i - 1, j), q + 1)
+ pow(src.at<uchar>(i - 1, j + 1), q + 1)
+ pow(src.at<uchar>(i, j - 1), q + 1)
+ pow(src.at<uchar>(i, j), q + 1)
+ pow(src.at<uchar>(i, j + 1), q + 1)
+ pow(src.at<uchar>(i + 1, j - 1), q + 1)
+ pow(src.at<uchar>(i + 1, j), q + 1)
+ pow(src.at<uchar>(i + 1, j + 1), q + 1)) /
(pow(src.at<uchar>(i - 1, j - 1), q)
+ pow(src.at<uchar>(i - 1, j), q)
+ pow(src.at<uchar>(i - 1, j + 1), q)
+ pow(src.at<uchar>(i, j - 1), q)
+ pow(src.at<uchar>(i, j), q)
+ pow(src.at<uchar>(i, j + 1), q)
+ pow(src.at<uchar>(i + 1, j - 1), q)
+ pow(src.at<uchar>(i + 1, j), q)
+ pow(src.at<uchar>(i + 1, j + 1), q));
}
}
imshow(window_name, img);
}
7. 效果展示
-
椒
-
盐
-
椒盐
-
高斯