Matlab 图像阈值化

Matlab Image thresholding

以下代码显示了蓝色和红色组合的图像。但是,如果我删除 close 语句,它会生成灰度图像(这正是我想要的)。

为什么会这样,以后可以避免吗?

我正在关注 this tutorial on youtube

    clear;
    animal1=imread('animal1.jpg');

    %% GrayScale
    animal2=rgb2gray(animal1);

    %% scale
    bright=animal2*1.5;
    imshow(bright);
    close;

    %% threshold
    binary= bright>220;
    imagesc(binary);

当您调用imshow函数时,会创建一个新图形,默认colormap设置为grayscale。如果不调用 close,imagesc 使用相同的 colormap,并使用灰度显示二值图像。

否则,当前图形被销毁,创建一个新的,imagesc函数定义一个新的colormap。本例中的默认 colormapparula,从蓝色渐变为黄色。

注意直接使用imshow函数可以显示二值图像

正如 @dlegland 所指出的,这是色图的问题。

在 MATLAB 中 colormap defines the way that data (in your image, plot, whatever) is mapped to a color on the screen. This is done via a linear mapping which can be different for each axes.

当您调用 imshow 时,它是一个相对高级的函数,它会更改显示它的轴的许多属性。这包括颜色图、颜色限制和刻度线等其他内容。在你的例子中,因为你给它一个灰度图像(你使用 rgb2gray 创建),它设置 figure/axes 使用 gray 颜色图。

然而,

imagesc 是一个较低级别的函数,不会 对当前轴进行任何更改,除了它会将颜色限制更改为跨越图像的整个动态范围。因此,当您使用 imagesc 在先前由 imshow 使用的轴上绘制图像时。它只是使用 imshow 正在使用的颜色图 (gray)。

如果未调用 imshow,则图形将使用默认颜色图(通常为 parula),您的图像将使用此颜色图显示。

现在的好处是您可以更改与 colormap 命令一起使用的颜色图。例如使用灰度,你会做

colormap gray

或者,如果您只想为特定轴指定该颜色图,您可以执行以下操作

ax = axes();
colormap(ax, gray)

您唯一的选择不是grayparula。 MATLAB 有许多内置的 colormaps 或者您甚至可以指定自己的自定义颜色图。