lpp8515 发表于 2011-1-20 10:07

matlab中如何保存(imwrite)uint8类型的二值化图片?

a=[1,1 ,1,1,1,1,1,1,1,1,1;0 ,0, 0,0,0,0,0,0,0,0,0;1,1,1,1,1,1,1,1,1,1,1;
         0,0,0,0,0,0,0,0,0,0,0;1,1,1,1,1,1,1,1,1,1,1;0,0,0,0,0,0,0,0,0,0,0];一张图片如上数组a所示,只有1和0两个值组成,我想把它保存起来,如果直接保存,那么再读入时就全部都是0和255的分布。将其转换成uint8类型(之所以要转换,是因为我要保存的图片很大,double型数据溢出),用imwrite(a,'1.bmp');之后,图像是黑色的,这种保存方式可能是灰度范围取的是0到255,我想请教一下,怎么样将只有0和1两个值的uint8图片保存起来,并且能够正常显示(不会是全黑)?

tenglang 发表于 2011-1-20 10:37

回复 1 # lpp8515 的帖子
这个是你想要的不?
>> a=[1,1 ,1,1,1,1,1,1,1,1,1;0 ,0, 0,0,0,0,0,0,0,0,0;1,1,1,1,1,1,1,1,1,1,1;
         0,0,0,0,0,0,0,0,0,0,0;1,1,1,1,1,1,1,1,1,1,1;0,0,0,0,0,0,0,0,0,0,0];
>> a=uint8(a)

a =

    1    1    1    1    1    1    1    1    1    1    1
    0    0    0    0    0    0    0    0    0    0    0
    1    1    1    1    1    1    1    1    1    1    1
    0    0    0    0    0    0    0    0    0    0    0
    1    1    1    1    1    1    1    1    1    1    1
    0    0    0    0    0    0    0    0    0    0    0

>> imwrite(a,'1.bmp');
>> b=imread('1.bmp')

b =

    1    1    1    1    1    1    1    1    1    1    1
    0    0    0    0    0    0    0    0    0    0    0
    1    1    1    1    1    1    1    1    1    1    1
    0    0    0    0    0    0    0    0    0    0    0
    1    1    1    1    1    1    1    1    1    1    1
    0    0    0    0    0    0    0    0    0    0    0

lpp8515 发表于 2011-1-20 11:28

回复 2 # tenglang 的帖子

我想要的是保存起来的imwrite(a,'1.bmp')这个图,你可以看下这个图是黑色的,并不是黑点白点的二值化分布,a这个矩阵比较小,可以用a1=repmat(a,10,10);将矩阵复制,然后看下imwrite(a1,'1.bmp')这个图,怎么样才能将这个图存成灰度范围为0到1的二值分布呢?

tenglang 发表于 2011-1-20 11:49

本帖最后由 tenglang 于 2011-1-20 13:11 编辑

我得到的也不是全黑啊
help中对a的数据类型也有要求. 你直接输入的,没格式化的就是 double类型.
Class Support
The input array A can be of class logical, uint8, uint16, or double. Indexed images (X) can be of class uint8, uint16, or double; the associated colormap, map, must be of class double. Input values must be full (non-sparse).

The class of the image written to the file depends on the format specified. For most formats, if the input array is of class uint8, imwrite outputs the data as 8-bit values. If the input array is of class uint16 and the format supports 16-bit data (JPEG, PNG, and TIFF), imwrite outputs the data as 16-bit values. If the format does not support 16-bit values, imwrite issues an error. Several formats, such as JPEG and PNG, support a parameter that lets you specify the bit depth of the output data.

If the input array is of class double, and the image is a grayscale or RGB color image, imwrite assumes the dynamic range is and automatically scales the data by 255 before writing it to the file as 8-bit values.

If the input array is of class double, and the image is an indexed image, imwrite converts the indices to zero-based indices by subtracting 1 from each element, and then writes the data as uint8.

If the input array is of class logical, imwrite assumes the data is a binary image and writes it to the file with a bit depth of 1, if the format allows it. BMP, PNG, or TIFF formats accept binary images as input arrays.
你可以这样: a1=logical(a2);
imwrite(a1,'4.bmp');图直接上来就变了,不知道为什么.

lpp8515 发表于 2011-1-20 14:56

回复 4 # tenglang 的帖子

logical是将数值型转换成逻辑型,图是出来了,但为什么是这样就不知道了
页: [1]
查看完整版本: matlab中如何保存(imwrite)uint8类型的二值化图片?