首页 > 解决方案 > 图像处理中的侵蚀

问题描述

我在下面写了这段代码,结果很糟糕,谁能帮助我,告诉我出了什么问题?我在 Qt 中写了这个。. 如果有人可以帮助我,那就太好了。

我的矩阵只是一些随机整数 0 或 1

while( x < obraz.width())
{
    while( y < obraz.height())
    {
    piksel2 = obraz.pixel(x, y);
    kolor2 = QColor::fromRgb(piksel2);
    minR = kolor2.red();
    minG = kolor2.green();
    minB = kolor2.blue();

       for(i = 0; i < w; i++)
        {
            for(j = 0; j < h; j++)
            {

                if (matrix[i][j] == 1 && x - o + i >= 0 && y - u + j >= 0 && x - o + i < obraz.width() && y - u + j < obraz.height())
                {
                    piksel = obraz.pixel(x - o + i, y - u + j);
                    kolor = QColor::fromRgb(piksel);

                    if (kolor.blue() < minB)
                    {
                    minB = kolor.blue();
                    }
                     if(kolor.green() < minG)
                 {
                    minG = kolor.green();
                 }

                    if(kolor.red() < minR)
                   {
                   minR = kolor.red();
                }
                }

            }

       }
        obraz.setPixel(x, y, qRgb(minR, minG, minB));

        y++;
    }
    y=1;
    x++;
}

输入文件:

在此处输入图像描述

输出文件:

在此处输入图像描述

标签: c++qtimage-processing

解决方案


代码的主要问题是它将每个像素的结果写入输入图像。此结果将在计算下一个像素的最小值时使用。因此,图像左上角的暗色块会传播到整个图像。

对于这种类型的算法而言,写入单独的输出缓冲区非常重要,在处理完整个图像之前保持输入不变。

还请注意,对于灰度图像,侵蚀是明确定义的,但对于彩色图像则不是。您似乎想要应用边际排序,这相当于独立计算每个通道的侵蚀。请注意,此方法将为图像引入新颜色。有更好的方法,但它们都有一些缺点。几年前我在我的博客上写了一个关于这个的小概述。


推荐阅读