卷积后的图像结果错误

时间:2018-04-01 17:32:23

标签: c++ image-processing convolution

我正在进行一项无需使用外部库即可执行卷积的作业。问题是所产生的图像应该是模糊的,但产生的图像是错误的。

这是我正在谈论的图片的链接。

enter image description here

程序将灰度RAW图像的前5个字节作为标题,其余部分作为2D矢量。每个像素强度(0-255)由unsigned char中的一个字节表示。 2D矢量用于卷积,然后将得到的矢量写入带有标题的新RAW图像。

{{1}}

此时我确信在写作阶段出现了问题,因为应该有一个黑色边框,但图像中缺少它。我可以用openCV显示数据,但也无法使其工作。我希望有人可以指出导致这个问题的原因。

dropbox link to the image i am working with

1 个答案:

答案 0 :(得分:0)

这不是一个完整的,已解决的“为你做的一切”类型的答案,而是一些帮助你入门的一般指导原则。

一般情况下,通过图像处理,您需要能够看到您正在使用的内容,因为您似乎有一种不寻常的格式,如果您可以使用可靠的程序查看输入和输出图像,将会有所帮助。 / p>

首先,您可以使用ImageMagick(安装在大多数Linux发行版上,可用于macOS和Windows)将图像转换为JPEG或PNG,如下所示:

在终端中将带有5字节标题的512x479图像转换为JPEG:

magick -depth 8 -size 512x479+5 gray:cana.raw result.jpg

enter image description here

这样更好 - 现在您可以轻松一致地查看结果。

接下来,最好有一些合理的样本图像,因此通过从图像中取出前5个标题字节并附加一堆(精确的245,248)零(黑色像素)来生成Perl的图像:

perl -e 'print `head -c5 cana.raw` . "\x00"x245248' > black.raw

然后再做一个白色的:

perl -e 'print `head -c5 cana.raw` . "\xff"x245248' > white.raw

中灰色:

perl -e 'print `head -c5 cana.raw` . "\x80"x245248' > grey.raw

因此,尝试应用您的阅读和写作,而不对每个人进行任何处理,并确保它们不会发生变化。然后加入你的卷积并再次测试。

最后,与您的调试器成为朋友。你没有说你正在使用什么编译器所以我不能在这里具体说明,但检查你的图像大小是否正确,并且你正在处理正确的行数和每行正确的元素数。

至于你的代码......你忘记将max设置为255.

此外,您似乎使用相同的数组来存储输出图像,就像您用于输入图像一样。这对于卷积不太有效,因为每个新像素都依赖于上面(和下面)像素的值,并且如果你已经处理了上一行的上一行通过循环并输出了输出值在那里...你将创造一个混乱,一半取决于原始图像和一半在新图像 - 这意味着你会得到鬼影和重复元素 - 就像你的图像出现。尝试为输出图像创建第二个数组。