如何将灰度图像反转并将其转换为二进制图像?

3

我不熟悉Matlab,但如果您能将第一张图中的白色方块反转而不是保持同一颜色,那么这将更容易完成。也许您只需要在绘制之前调整绘图设置? - tvanfosson
5个回答

5

这取决于您的输入矩阵的类型。

如果它是逻辑矩阵,您可以简单地使用

invImg = ~img;

如果您需要处理范围在0到n之间的标量值,请使用:
invImg = n - img;

编辑:

如果您想要一张黑白图像,请尝试以下方法(也许您需要调整level参数):

invImg = ~im2bw(img, 0.5);

1
网格仍然存在,只是非常微弱。 - Jonas
1
这是因为在白色背景图像中,网格线不是黑色的,而是灰色的。 - Donnie

3
我在处理你上面发布的第二张图片时遇到了一些困难。由于它是JPEG格式,图像压缩似乎使得线条和文字变得模糊,这会使得按你想要的方式进行阈值处理变得复杂。
相反,我回到了你在先前相关问题中发布的索引颜色GIF图像上,使用图像处理工具箱中的IND2GRAY函数将其转换为灰度,然后将其转换为反转的黑白图像以匹配你上面发布的第一张图片的格式。这是我使用的代码:
[X,map] = imread('original_chart.gif');  %# Load the indexed color image
img = ind2gray(X,map);                   %# Convert the image to grayscale
reversedImage = img < max(img(:));       %# Convert to reversed black and white

这里是reversedImage的样子:

alt text


你能看一下这个图是如何生成的吗?https://dev59.com/x07Sa4cB1Zd3GeqP1jnl#2975223 - user198729

3

如何翻转颜色映射表?

颜色映射表翻转代码如下:

colormap(flipud(colormap));


1

你的图像不是二进制的黑白。里面还有灰色。

根据你的编辑,似乎你希望任何一个亮点变为暗点,任何一个暗点变为亮点(即将其转换为纯粹的二进制黑白图像),这个方法应该能满足你的需求:

newImg = zeros(size(img));
newImg(img > 0) = 0;    % <-- This line is not really needed
newImg(img = 0) = 1;

请注意第二行并不是必需的,因为新图像无论如何都将被初始化为0,它只是为了展示正在发生的事情。

1

看起来第三个图是上面第二个的反转。

需要考虑的一件事是你用什么来绘制图像,image()imagesc()还是imshow()imagesc()会自动缩放,而imshow()则会使用颜色映射。

另一件需要考虑的事情是输入图像本身。它的范围是0-255、0-1.0还是RGB?根据不同的情况,反转的结果也会不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接