繁体   English   中英

OpenCV:标准化框过滤器平滑

[英]OpenCV : Normalized Box Filter Smoothing

我正在尝试使用以下方法为我的图像做一个简单的平滑过滤器 在此处输入图片说明

我有使用OpenCV Blur的预期结果

void blur()
{

   blur(image1, image2, cv::Size(3, 3));


   imshow("Orginal", image1);
   imshow("Filtered", image2);
   waitKey(0);
}

在此处输入图片说明

我还从OpenCV中阅读了一些详细信息:了解内核

但我想学习如何在不使用OpenCV功能的情况下进行过滤,但是在理解将图像与某些内核卷积时遇到了一些问题 在此处输入图片说明 在此处输入图片说明

来自https://en.wikipedia.org/wiki/内核_(图像处理) 在此处输入图片说明

我尝试使用到目前为止所了解的知识,这是我的代码(“ 3x3矩阵” ),但是accumulator = image1.at<Vec3b>(x, y) * kernelarray[x + k][y + l];

  Mat image1 = imread("Balloon.jpg", CV_LOAD_IMAGE_ANYCOLOR);
  void filter(Mat image1)
 {
 const int kernelWidth = 3;
 const int kernelHeight = 3;

float kernelarray[kernelWidth][kernelHeight];

int accumulator;

for (int x = 0;x < image1.rows;x++) 

    for (int y = 0; y < image1.cols;y++) {

        accumulator = 0;

        for (int k = 0;k < 3;k++)
        {
            for (int l = 0;l < 3;l++)
            {
                accumulator = image1.at<Vec3b>(x, y) * kernelarray[x + k][y + l];

            }
            image1.at<Vec3b>(x, y) = accumulator;
        }
 }
}

我应该为我做些什么以获得我想要的预期结果?

图像卷积是一种操作,其中像素颜色根据该像素的邻居的颜色而改变。 每个像素(图像边缘除外)有8个相邻像素。 如果将像素及其相邻像素放在矩阵中,则像素居中且周围相邻。

您要做的是为每个邻居设置一个“权重”(以加权平均值计)。 然后,您只需添加每个邻居乘以其权重的结果。 中心像素也可以有自己的权重。 这是总共9个乘法和和。 您将结果(裁剪到0-maxColor范围后)分配给中心像素。

当您要对图像中的所有像素进行卷积时,通常希望使用相同的权重。 这9个权重组称为“内核”。 不同的内核产生不同的结果。

如果将权重写在矩阵中,则会得到两个矩阵:pixel及其邻居,所有矩阵的权重。 但这只是一种表示。 这里不涉及矩阵运算

您不仅可以使用8个邻居,还可以使用22个邻居,然后需要23个权重。

在您的代码中,kernelarray未填充权重。

啊,解决了

for (int y = 1; y < src.rows - 1; y++) {
    for (int x = 1; x < src.cols - 1; x++) {
        sum = 0.0;
        for (int k = -1; k <= 1;k++) {
            for (int j = -1; j <= 1; j++) {
                sum = sum + Kernel[j + 1][k + 1] * src.at<uchar>(y - j, x - k);

显然,用灰度比用颜色平滑更容易

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM