我写了一个自动识别水中絮体并计算絮体体积、分形维数的算法

貌似直接上代码,虽然显得本人实诚,但是并不被CSDN的算法看中,看来我还要再写一些废话。
好了
这个代码是直接放在matlab编译器里就可以写的
只不过需要你提前存放一张水体图片。
大家就用我这个吧。
在这里插入图片描述

clear;clc;
%%xt.jpg、xt.png都是我们的原始絮体图片的名字
img = imread('xt.jpg');%读取jpg格式文件,存为img空间
figure,imshow(img);%在新的一张figure中显示img
img = im2bw(img);%将img转为二进制黑白文件,存为img空间。
original_picture=imread('xt.png');%读取png格式文件,存为original_picture
img2=im2gray(original_picture);%将original_picture转为灰度图,存为img2空间
[m,n] = size(img2);%这里获取灰度图的像素的行列总数
%%
% 进行最大灰度、最小灰度计算。总的思想就是遍历所有img2像素,并两两作比较
max = 0;
min = 255;
sum = 0;
avg = 0;
for i=1:1:m
    for j=1:1:n
        if (img2(i,j) > max)
            max = img2(i,j);%最大灰度
        end
        if (img2(i,j) < min)
            min = img2(i,j);%最小灰度
        end
        sum = sum + double(img2(i, j));
    end
end
avg = sum/(m*n);%平均灰度

figure; imshow(img2);
%创建一个新的窗口,将img2绘制。
figure,imshow(img);
%创建一个新的窗口,将二进制黑白的图像img绘制。
[B,L] = bwboundaries(img);%利用该函数获取絮体的各个轮廓,其中B返回的每个絮体,L是每个絮体的坐标
%%
%对每个絮体进行标记
hold on;
for k = 1:length(B)%对絮体进行遍历
    boundary = B{k};
    plot(boundary(:,2),boundary(:,1),'g','LineWidth',2);
end
[L,N] = bwlabel(img);
img_rgb = label2rgb(L,'hsv',[.5 .5 .5],'shuffle');%给每个絮体生成一个颜色
figure,imshow(img_rgb);%绘制絮体区域
hold on
for k =1:length(B)
    boundary = B{k};
    plot(boundary(:,2),boundary(:,1),'w','LineWidth',2);%绘制絮体的边界:w代表white白色
    text(boundary(1,2),boundary(1,1),num2str(k),'Color','y','Fontsize',14,'FontWeight','bold');%给每个絮体进行编号
end
hold off;
%%
%输出每个标签的面积与周长
for i=1:length(B)%同样遍历每个絮体B
    sumL(i)=0;%初始化面积
    sumC(i)=0;%初始化周长
    %以下初始化x、y方向的长度
    minx_lenth(i)=100000;
    maxx_lenth(i)=0;
    miny_lenth(i)=100000;
    maxy_lenth(i)=0;
    %因为L存储的是絮体的像素坐标,用两层for遍历像素坐标
    for k =1:length(L(:,1))%k是行数
        for j=1:length(L(1,:))%j是列数
            if L(k,j)==i%如果改坐标对应的标签L是i, sumL(i)代表i标签对应的絮体的面积就+1
                sumL(i)=sumL(i)+1;
                %%%%%%%%%%%%%%%%%%%%判断i标签的最大长度,最大长度主要是用来计算分形维数
                if k<minx_lenth(i)
                    minx_lenth(i)=k;
                end
                if k>maxx_lenth(i)
                    maxx_lenth(i)=k;
                end
                if j<miny_lenth(i)
                    miny_lenth(i)=j;
                end
                if j>maxy_lenth(i)
                    maxy_lenth(i)=j;
                end
                %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            end
        end
    end
    if maxy_lenth(i)-miny_lenth(i)>maxx_lenth(i)-minx_lenth(i)%判断哪个方向是絮体的长度方向。
        maxL(i)=maxy_lenth(i)-miny_lenth(i);%各个絮体最大长度
    else
        maxL(i)=maxx_lenth(i)-minx_lenth(i);%各个絮体最大长度
    end
    equi_diameter(i)=sqrt(4*sumL(i)/pi);%这里计算的是各个标签i的等效直径
    [row,col]=size(B{i});%获取B的行数、列数
    for t=1:row-1%利用两点的距离完成轮廓的周长计算
        delta_x=abs(B{i}(t,1)-B{i}(t+1,1));
        delta_y=abs(B{i}(t,2)-B{i}(t+1,2));
        sumC(i)=sumC(i)+ sqrt(delta_y.^2+delta_x.^2);%sumC是絮体的周长
    end
end

%%
% 计算分形维数
for i=1:length(B)
    DF1(i)=log(sumL(i))./log(10);
    DF2(i)=log(maxL(i))./log(10);
    DF(i)= DF1(i)./DF2(i);
end
%%
%变量说明:DF(i)—— 分形维数;sumC(i)——絮体周长; maxL(i)——絮体最大长度; sumL(i)————絮体面积;avg
%——图像平均灰度;max ————最大灰度;min ————最小灰度



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
以下是MATLAB代码,用于批量处理图像计算分形维数并输出分形维数计算到Excel表格: ```matlab % 1. 设置图像文件夹路径和输出Excel文件路径 img_folder = 'D:\Images\'; % 图像文件夹路径 output_file = 'D:\Fractal_Dimensions.xlsx'; % 输出Excel文件路径 % 2. 获取图像文件夹中的所有图像文件名 img_files = dir(fullfile(img_folder, '*.jpg')); % 假设图像格式为.jpg % 3. 创建一个新的Excel文件并添加表格 fractal_data = table(); % 创建一个空表格 writetable(fractal_data, output_file, 'Sheet', 1); % 在Excel中添加表格 % 4. 遍历图像文件夹中的所有图像计算分形维数 for i = 1:length(img_files) % 4.1 读取图像 img_name = fullfile(img_folder, img_files(i).name); img = imread(img_name); % 4.2 计算分形维数 dim = boxcount(img); % 4.3 将图像文件名和分形维数添加到表格中 fractal_data = [fractal_data; table({img_files(i).name}, dim)]; end % 5. 将表格入Excel文件 writetable(fractal_data, output_file, 'Sheet', 1); % 定义一个函数用于计算分形维数 function dim = boxcount(I) % 将图像转换为灰度图像并将像素值范围缩放至[0, 1] I = double(rgb2gray(I)) / 255; % 定义不同分辨率下的盒子大小 scales = 2.^(2:7); % 计算每个分辨率下需要的盒子数 counts = zeros(size(scales)); for i = 1:length(scales) scale = scales(i); counts(i) = count_boxes(I, scale); end % 计算分形维数 log_counts = log(counts); log_scales = log(scales); p = polyfit(log_scales, log_counts, 1); dim = p(1); end % 计算给定分辨率下需要的盒子数 function count = count_boxes(I, scale) [h, w] = size(I); count = 0; for y = 1:scale:h-scale+1 for x = 1:scale:w-scale+1 sub_I = I(y:y+scale-1, x:x+scale-1); if any(sub_I(:)) && all(sub_I(:) ~= 1) count = count + 1; end end end end ``` 这个代码会计算一个图像文件夹中所有图像分形维数,并将结果一个Excel文件。请注意,代码中使用的分形维数计算方法是盒计数法。您可以根据需要修改该代码以使用不同的分形维数计算方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方sir点云学习经验分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值