回転を許して面積が最小になる外接矩形を求めるプログラムを作成してみました(たぶんちゃんと動いていると思いますが、何らか極端なケースで変な結果が出る可能性もありますので、常に可視化して結果の妥当性ご確認ください)。下記が添付のプログラムを動かす例となります。
clear, close, clc;
%% generate test data
im = imread('hirn0vxp.png');
% 画像をグレースケールに変換します。
im_gray = rgb2gray(im);
% 画像を二値化します。
bw = imbinarize(im_gray);
bw = imclearborder(bw); % 画像端にかかる粒子は除く
%% 画像中の全ての小領域に対して、最小面積となる外接矩形を計算
% 幅、高さ、回転角度、4隅の座標を出力
minrect_info = im_minarearect(bw);
%% 結果の可視化
imshow(bw)
hold on;
for rgi = 1:height(minrect_info)
pt_corners = minrect_info.Corner_Points{rgi};
temp = [pt_corners;pt_corners(1,:)];
plot(temp(:,1),temp(:,2),'g-o');
pt_center = mean(pt_corners,1);
text(pt_center(1),pt_center(2),...
{sprintf('area:%5.1f',minrect_info.Min_Area(rgi)),sprintf('rot:%3.1f',minrect_info.Rotation_Angle(rgi))},...
"Color",'g');
text(pt_corners(:,1),pt_corners(:,2),num2str([1:4]'),'Color','y');
end
hold off;
これを動かすと下記のような図が出てくるかと思います。
座標の並び順や回転角度の定義などは下記の通りです。