Hi predecessors,
I have this kind of spray image and I want to calculate the droplet size and distribution of the particles, and wondering if there is a way to do that on MATLAB so that I can learn from it. Thanks!
Here are what I do now, I really appreciate you can help to point out the errors or mistakes,and if you are me, what code will you use to realize this function.
clc
clear all;
image=imread('E:\picture_test\heitu.tiff');
jqimage=image(2000:2500,2000:2500);
imshow(jqimage,[0 4000]);title('jiequ');
[gradthresh,numofiter]=imdiffuseest(jqimage);
diffusedImage=double(imdiffusefilt(jqimage,'GradientThresh',gradthresh,'NumberOfIterations',numofiter));
imshow(diffusedImage,[0 4000]);
[testx,testy]=size(diffusedImage);
array_x=zeros(501,501);
blank_x=zeros(501,501);
y=zeros(1,501);
for i=1:testx
testx_temp=diffusedImage(i,:);
for i1=2:testy-1
y(i1)=abs((testx_temp(i1+1)-testx_temp(i1-1))/2);
end
array_x(i,:)=y;
[pks,locs]=findpeaks(array_x(i,:),"MinPeakHeight",40);
blank_x_i=blank_x(i,:);
for i2=1:length(locs);
blank_x_i(locs(i2))=1;
end
blank_x(i,:)= blank_x_i;
end
array_y=zeros(501,501);
blank_y=zeros(501,501);
x=zeros(501,1);
for i=1:testy
testx_temp=diffusedImage(:,i);
for i1=2:testx-1
x(i1)=abs((testx_temp(i1+1)-testx_temp(i1-1))/2);
end
array_y(:,i)=x;
[pks,locs]=findpeaks(array_y(:,i),"MinPeakHeight",40);
blank_y_i=blank_y(:,i);
for i2=1:length(locs);
blank_y_i(locs(i2))=1;
end
blank_y(:,i)= blank_y_i;
end
figure;
imagesc(blank_x);
hold on;
imagesc(blank_y);
add_ab=blank_x+blank_y;
imagesc(add_ab);
figure;
binaryimage=im2bw(add_ab);
imshow(binaryimage);
binaryimage=imfill(binaryimage,'holes');
imshow(binaryimage);title('binaryimage');
figure
labeledimage=bwlabel(binaryimage,8);
imshow(labeledimage);
coloredlabels=label2rgb(labeledimage,'hsv','k','shuffle');
hold on;
imshow(coloredlabels);
blobmeasurements=regionprops(labeledimage,add_ab,'all');
numberofblobs=size(blobmeasurements,1);
boundaries=bwboundaries(binaryimage);
numberofboundaries=size(boundaries,1);
for k1=1:numberofboundaries
thisboundary=boundaries{k1};
plot(thisboundary(:,2),thisboundary(:,1),'g','LineWidth',2);
end
for k2=1:numberofblobs
blobarea=blobmeasurements(k2).Area;
blobecd(k2)=sqrt(4*blobarea/pi);
fprintf('%d\n',blobecd(k2))
end

2 件のコメント

Image Analyst
Image Analyst 2023 年 2 月 10 日
This
jqimage=image(2000:2500,2000:2500);
does not work with the particle.jpg image you attached. It's not big enough.
Jason
Jason 2023 年 2 月 12 日
Thanks professor, I know this problem, now it is only for testing.Could you please help write a program that can implement this function?it may be better to learn.Thanks a lot

サインインしてコメントする。

回答 (2 件)

prasanth s
prasanth s 2023 年 2 月 11 日
編集済み: Image Analyst 2024 年 9 月 28 日

0 投票

Use 'kmeans' for segmentation and 'regionprops' to get properties of particles,
image=imread('particle.jpg');
jqimage=rgb2gray(image);
[idx,C]=kmeans(jqimage(:),5);
Warning: Failed to converge in 100 iterations.
c_image=reshape(idx,size(jqimage));
droplets=c_image==1;
imshow(droplets);
stats=regionprops(droplets);
average_area=mean([stats.Area])
average_area = 3.1781
[edit: attached image and ran the code]

3 件のコメント

Jason
Jason 2023 年 2 月 12 日
Thanks for your kind help,I'll try it
Khai
Khai 2024 年 9 月 28 日
編集済み: Khai 2024 年 9 月 28 日
@Jason Could you please help me to provide full code. Thank you so much for your supprot
Image Analyst
Image Analyst 2024 年 9 月 28 日
kmeans is not the best function to use here. It is basically going to threshold the image into 5 different brightness ranges. In fact class/range 1, which he uses to form the segmented image, is unknown - class 1 may refer to different intensity ranges and hence different particles every time (will not necessarily always be the darkest particles).

サインインしてコメントする。

Image Analyst
Image Analyst 2023 年 2 月 12 日

0 投票

Try imbothat bottom hat filter.

製品

リリース

R2020a

質問済み:

2023 年 2 月 9 日

コメント済み:

2024 年 9 月 28 日

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by