接する円を作製して幅を測定したいです。
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
下記コードを用い、添付の液体画像(Image1.bmp)を読み込んで、二値化してスケルトン処理で中心線をだします。
その後、その中心線状に中心を持ち、元画像の液体の両方に接するような円を作製し、その直径から幅をはかるプログラムが作製したいです。
以下、スケルトン処理までのコードです。
宜しくお願いいたします。
%画像の読み込み
file1 = 'Image1.bmp';
I1 = imread(file1);
%二値化
BW1 = imbinarize(I1,0.528);
%左側除去
BW1(1:256,1:159) = 1;
%右側除去
BW1(1:256,259:512) = 1;
%白黒反転
BW1 = imcomplement(BW1);
%画像調整
BW1 = bwareafilt(BW1,1);
BW1 = imfill(BW1,"holes");
%モルフォロジー処理
BW2 = bwskel(BW1,'MinBranchLength',50);
BW2 = bwareaopen(BW2,4);
BW2(223:256,1:512) = 0;
%元画像に液体中心線を重ねる
BW2 = imcomplement(BW2);
file2 = "Image2.bmp";
imwrite(BW2,file2);
I2 = imread(file2);
masked_image = I1 .* uint8(I2);
file3 = "Image3.bmp";
imwrite(masked_image,file3);
0 commentaires
Réponse acceptée
Tohru Kikawada
le 13 Fév 2023
液体の流れに内接する円の半径を見つけたいということだと理解しました。
冗長かもしれないですが下記のコードでやられたいに近いことができるかと思います。
このような例を探す場合には英語で「 inscribed circle maximum radius」などで検索されると見つけやすいかもしれません。
%画像の読み込み
file1 = 'Image1.bmp';
I1 = imread(file1);
%二値化
BW1 = imbinarize(I1,0.528);
%左側除去
BW1(1:256,1:159) = 1;
%右側除去
BW1(1:256,259:512) = 1;
%下側除去
BW1(end-50:end,:) = 1;
% オープン処理&面積フィルタでゴミを取り除き、穴埋め
BW1 = imopen(~BW1,strel("disk",2));
BW1 = bwareaopen(BW1,300);
BW1 = imfill(BW1,"holes");
% 画像枠に接触しているオブジェクトを除去
BW1 = imclearborder(BW1);
imshow(BW1)
% 輪郭抽出
[B,L] = bwboundaries(BW1,'noholes');
imshow(label2rgb(L, @jet, [.5 .5 .5]))
hold on
for k = 1:length(B)
boundary = B{k};
plot(boundary(:,2), boundary(:,1), 'w', 'LineWidth', 2)
end
% 距離画像を作り、ピーク値が半径、場所が円の中心
% Image Analyst様の回答を参考に作成
% https://www.mathworks.com/matlabcentral/answers/357943-maximum-inscribed-circle-problem#answer_282733
mask = poly2mask(boundary(:,2), boundary(:,1), size(BW1,1), size(BW1,2));
hold off;
imshow(mask)
edtImage = bwdist(~mask);
imagesc(edtImage)
axis image
maxRadius = max(edtImage(:));
[y, x] = find(edtImage == maxRadius);
% 可視化
I2 = insertShape(I1,"circle",[x, y, maxRadius],"Color","red");
I2 = insertText(I2,[x,y]+10,"Radius:"+string(maxRadius)+" pixel",...
"FontSize",20);
imshow(I2);
Plus de réponses (0)
Voir également
Catégories
En savoir plus sur Convert Image Type dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!