c++ - 图像处理中的侵蚀
问题描述
我在下面写了这段代码,结果很糟糕,谁能帮助我,告诉我出了什么问题?我在 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++;
}
输入文件:
输出文件:
解决方案
代码的主要问题是它将每个像素的结果写入输入图像。此结果将在计算下一个像素的最小值时使用。因此,图像左上角的暗色块会传播到整个图像。
对于这种类型的算法而言,写入单独的输出缓冲区非常重要,在处理完整个图像之前保持输入不变。
还请注意,对于灰度图像,侵蚀是明确定义的,但对于彩色图像则不是。您似乎想要应用边际排序,这相当于独立计算每个通道的侵蚀。请注意,此方法将为图像引入新颜色。有更好的方法,但它们都有一些缺点。几年前我在我的博客上写了一个关于这个的小概述。
推荐阅读
- google-ads-api - Google 广告脚本,AdsApp.adGroups().get() 返回空
- python-3.x - 具有扩展窗口功能的熊猫多索引
- java - jar 不能通过双击在 Mac 上运行
- google-cloud-platform - 如何将一个 bigquery 数据集复制或传输到来自不同 gcp 组织的另一个 bigquery
- php - 带有 Volley Kotlin 的 RESTful API 不起作用
- spring-data-jpa - 如何使用 CriteriaApi 或 JPA 通过“WHERE”之后的表达式部分进行选择
- html - 在 Linux 中绘图而无需在封闭系统上安装
- excel - 根据条件删除单元格中的某些文本
- html - 为什么在浏览器中运行时我的网页底部有空白?
- spring - Spring Web Client 没有正确绑定 JSON 到 POJO?