Matlab对图像分别进行灰度化与二值化

参考博客https://zhuanlan.zhihu.com/p/37419809

https://zhuanlan.zhihu.com/p/34106431

function z = r2gb( data )
%函数的功能为将一个rgb图像数据转化为灰度数据、二值数据

gray_data = rgb2gray(data);
%把RGB图像(三维矩阵)转化成灰度图像,得到的gray_data是一个八阶灰度的二维矩阵
%这里的gray_data是uint8类型的数据,是不能被fraclab处理的

threshold = graythresh(gray_data);%自动确定二值化阈值
binary_data = im2bw(gray_data,threshold);%对图像进行二值化
%把一个灰度图像转化成二值图像,这里得到的binary_data是一个逻辑型数据,无法被FracLab识别

binary_data_double = double(binary_data);%把逻辑型数据转化成双精度的数值型数据以用于后续的操作
binary_data_reverse_double = double(~binary_data);%对二值数据求反并转换为数值型数据

%%=======================================这里很重要==========================================
%之所以要求反,是因为对于二值图像而言白色区域为1,黑色区域为0
%很多图像的图像特征是用黑色曲线来表征的,这样的图像经过二值化之后数值为1的点对应的是背景
%导致最终计算得到的是背景的分形维数而不是我们想要的曲线的分形维数,这种情况下需要对图像进行求反
%后续的数据操作对象为binary_data_reverse
%如果图像本身就是用白色曲线来表征它的特征,则后续的数据操作对象为binary_data
%%=======================================这里很重要==========================================

figure
subplot(2,2,1);imshow(gray_data);title('Grayscale Image');
subplot(2,2,2);imshow(binary_data_double);title('Binary Image');
subplot(2,2,3);imshow(binary_data_reverse_double);title('Reversal Binary Image');

assignin('base','binary_data_reverse',binary_data_reverse_double)
assignin('base','gray_data',gray_data)
assignin('base','binary_data',binary_data_double)
%将需要的中间变量呈现在工作区
end
files = dir(fullfile('C:\Users\Administrator\Desktop\MATLAB代码\血管网络分形测试\血管树图\600x600\','*.png'));
lengthFiles = length(files);
for i = 1:lengthFiles;
    Img = imread(strcat('C:\Users\Administrator\Desktop\MATLAB代码\血管网络分形测试\血管树图\600x600\',files(i).name));%文件所在路径
    gray_data = rgb2gray(Img)%把RGB图像(三维矩阵)转化成灰度图像,得到的gray_data是一个八阶灰度的二维矩阵
    %这里的gray_data是uint8类型的数据,是不能被fraclab处理的
    threshold = graythresh(gray_data);%自动确定二值化阈值
    binary_data = im2bw(gray_data,threshold);%对图像进行二值化
    %把一个灰度图像转化成二值图像,这里得到的binary_data是一个逻辑型数据,无法被FracLab识别
    binary_data_double = double(binary_data);%把逻辑型数据转化成双精度的数值型数据以用于后续的操作
    binary_data_reverse_double = double(~binary_data);%对二值数据求反并转换为数值型数据
   %=======================================这里很重要==========================================
    %之所以要求反,是因为对于二值图像而言白色区域为1,黑色区域为0
    %很多图像的图像特征是用黑色曲线来表征的,这样的图像经过二值化之后数值为1的点对应的是背景
    %导致最终计算得到的是背景的分形维数而不是我们想要的曲线的分形维数,这种情况下需要对图像进行求反
    %后续的数据操作对象为binary_data_reverse
    %如果图像本身就是用白色曲线来表征它的特征,则后续的数据操作对象为binary_data
    %%=======================================这里很重要==========================================
figure
subplot(2,2,1);imshow(gray_data);title('Grayscale Image');
subplot(2,2,2);imshow(binary_data_double);title('Binary Image');
subplot(2,2,3);imshow(binary_data_reverse_double);title('Reversal Binary Image');

assignin('base','binary_data_reverse',binary_data_reverse_double)
assignin('base','gray_data',gray_data)
assignin('base','binary_data',binary_data_double)
%将需要的中间变量呈现在工作区
end

批量二值化并保存

files = dir(fullfile('C:\Users\Administrator\Desktop\MATLAB代码\血管网络分形测试\血管树图\600x600\','*.png'));
lengthFiles = length(files);
for i = 1:lengthFiles;
    Img = imread(strcat('C:\Users\Administrator\Desktop\MATLAB代码\血管网络分形测试\血管树图\600x600\',files(i).name));%文件所在路径
    %     gray_data = Img; % 测试灰度化是否有影响
    gray_data = rgb2gray(Img);%把RGB图像(三维矩阵)转化成灰度图像,得到的gray_data是一个八阶灰度的二维矩阵
%     disp(gray_data)
    %这里的gray_data是uint8类型的数据,是不能被fraclab处理的
    threshold = graythresh(gray_data);%自动确定二值化阈值
    binary_data = im2bw(gray_data,threshold);%对图像进行二值化
%     disp(binary_data)
    %把一个灰度图像转化成二值图像,这里得到的binary_data是一个逻辑型数据,无法被FracLab识别
    binary_data_double = double(binary_data);%把逻辑型数据转化成双精度的数值型数据以用于后续的操作
    binary_data_reverse_double = double(~binary_data);%对二值数据求反并转换为数值型数据
%     disp(binary_data_reverse_double)
%     disp(size(binary_data_reverse_double))
   %=======================================这里很重要==========================================
    %之所以要求反,是因为对于二值图像而言白色区域为1,黑色区域为0
    %很多图像的图像特征是用黑色曲线来表征的,这样的图像经过二值化之后数值为1的点对应的是背景
    %导致最终计算得到的是背景的分形维数而不是我们想要的曲线的分形维数,这种情况下需要对图像进行求反
    %后续的数据操作对象为binary_data_reverse
    %如果图像本身就是用白色曲线来表征它的特征,则后续的数据操作对象为binary_data
    %%=======================================这里很重要==========================================
    imshow(binary_data_reverse_double);%原图Img 灰度图gray_data 未反转0-1二值图binary_data_double 反转0-1二值图binary_data_reverse_double 
    imwrite(~binary_data,strcat('C:\\Users\\Administrator\\Desktop\\MATLAB代码\\血管网络分形测试\\血管树图\\二值图\\a',num2str(i),'.png'));
    close all;
end

猜你喜欢

转载自blog.csdn.net/qq_38826019/article/details/85273475