解决使用MATLAB进行图像二值化后图像还是有灰度值问题

版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/huanhuan_Coder/article/details/81027788

        最近使用MATLAB对JPEG格式的灰度图像进行二值化,二值化后的图像非0即1(1代表的是白色,0代表的是黑色),我按照图像原本的名字保存,所以格式也没变,但是再次打开图像时还是存在非01的灰度值。
        最初的时候我有bug的代码如下:

% writen by liuhuan 
imgPath = 'F:\cutImage\123\';        % 图像库路径
imgDir  = dir([imgPath '*.jpg']); % 遍历所有jpg格式文件
for i = 1:length(imgDir)          % 遍历结构体就可以一一处理图片了
    img = imread([imgPath imgDir(i).name]); %读取每张图片
    thresh = graythresh(img);     %自动确定二值化阈值
    imgBW = im2bw(img,thresh);  %对图像二值化
    imwrite(imgBW,[imgPath imgDir(i).name]);
end;

        下面这是处理之前灰度图的部分像素值:
这里写图片描述
        下面是二值化之后的图像的部分像素值:
这里写图片描述
        当我打开二值化之后的图像时,出现了以下状况:
这里写图片描述
        按照逻辑来说,上图像素应该是非0即255的,但是为什么出现了166,85等值呢?原因是我在保存图片的时候使用的是jpg格式,但是jpg格式的图片是有损耗的,bmp格式是没有损耗的,所以我们要选择保存为bmp格式。修改的代码如下:

% writen by liuhuan 
imgPath = 'F:\cutImage\123\';        % 图像库路径
imgDir  = dir([imgPath '*.jpg']); % 遍历所有jpg格式文件
for i = 1:length(imgDir)          % 遍历结构体就可以一一处理图片了
    img = imread([imgPath imgDir(i).name]); %读取每张图片
    filename = imgDir(i).name;  %获取图片的名字
    thresh = graythresh(img);     %自动确定二值化阈值
    imgBW = im2bw(img,thresh);  %对图像二值化
    i = find('.'==filename);
    imname = filename(1:i-1);
    imwrite(imgBW,[imgPath strcat(imname,'.bmp')]);
end;

        下面我们讲讲怎样修改图片名。

  • filename = imgDir(i).name; 是获取文件夹下图片的名字,例如cat.jpg,下面我们以此为例。
  • i = find(‘.’==filename);是计算图片名称中. 的索引,如在cat.jpg中,. 的索引是4。
  • imname = filename(1:i-1);是取索引为从1到4-1的字符串为名字,即cat。
  • imwrite(imgBW,[imgPath strcat(imname,’.bmp’)]);是将二值化的图片保持到后面的地址中。

        这样保存的图就不存在灰度值了~

猜你喜欢

转载自blog.csdn.net/huanhuan_Coder/article/details/81027788
今日推荐