こんにちは。
関数を使って次のようにやってみました。
3つの画像で線の長さは本当は一緒なんでしょうか。
それぞれ試してみたところ次のようになりました(単位:px)。
image1 - 396.6792
image2 - 394.6420
image3 - 395.8294
function length = lineLength(image)
% 白画素の位置を取得
stats = regionprops(image, "PixelList");
p = [stats.PixelList];
% 各画素の座標値がサンプリング点座標である
% これは離散値(整数)なのでそのまま点間の距離を測ると実際より長くなる。なので移動平均を使って滑らか(実数)にする
p_smooth = movmean(p, 5, 1);
% 各点間の距離を出す
distances = sqrt(diff(p_smooth(:,1)).^2 + diff(p_smooth(:,2)).^2);
% 足し合わせて線の長さの近似値を得る
length = sum(distances);
end
ちなみにbwmorphという関数の中でendpointをとってくることが出来ますし、find関数でもfor文の中でやられているようなことは高速にできるかと思います。いろいろな関数があるのでうまく使って楽しちゃってください。