行列データのイメージ表示で菱形を表現する方法

4 views (last 30 days)
Yuki Tsukahara
Yuki Tsukahara on 31 Jul 2023
配列データを読み込んでイメージ表示するときに,ななめの線を表現する方法はありますか?
data2_1には10×10の行列が作成されており,下記のようにdata2_1を反転させた行列(data2_2からdata2_4)を結合して,以下のようなイメージ図を作成しています.
data2_2=flipud(data2_1);%上下反転
data2_3=fliplr(data2_2);%左右反転
data2_4=fliplr(data2_1);%左右反転
cmap = colormap("default");
data3_1=horzcat(data2_3,data2_2);
data3_2=horzcat(data2_4,data2_1);
data4=vertcat(data3_1,data3_2)
im = data4 ; imagesc(im);colorbar;
colormap default;
colorbar;
clim([100 450]); % カラーマップの値域を100~450に設定
作成された図の青い領域について,辺が階段のように表現されていますが,線で表現してきれいな菱形になるようにしたいです.
何かいい方法はありますか?

Answers (1)

交感神経優位なあかべぇ
data2_1を模したサンプルデータから斜め線を表現させた例を書きました。
辺が階段のようになっている位置を検索し、その位置の近似直線を計算しました。
% data2_1を模したサンプルデータの作成
data2_1 = repmat(400, 10, 10);
col = repelem(3:10, 1:8);
rowcell = arrayfun(@(x) {1:x},1:8);
row = 11 - [rowcell{:}];
ind = sub2ind(size(data2_1), row, col);
data2_1(ind) = 200;
% 作成したサンプルデータの描画
imagesc(data2_1);
colorbar;
clim([100 450]);
BW = data2_1 > 300; % 300を基準に2値データにする。
% 縦方向に対して0,1、もしくは1,0となっているデータの境界を検索する。
rowDiff = diff(BW,1,1);
rowDiff = rowDiff ~= 0;
% 横方向に対して0,1、もしくは1,0となっているデータの境界を検索する。
colDiff = diff(BW,1,2);
colDiff = colDiff ~= 0;
% 検索した境界値から、境界の位置データに変換する。
[row, col] = find(rowDiff);
data = [row + 0.5, col];
[row, col] = find(colDiff);
data = [data; row, col + 0.5];
% 境界の位置データを描画
imagesc(data2_1);
colorbar;
clim([100 450]);
hold on;
scatter(data(:,1), data(:,2));
p = polyfit(data(:,1), data(:,2), 1); % 境界の位置データから近似直線を計算する。
% xが0と20の時の近似直線のy値を計算する。
x = [0,size(data2_1, 2)*2];
y = polyval(p, x);
% 近似直線の描画
figure;
imagesc(data2_1);
clim([100 450]);
colorbar;
hold on;
scatter(data(:,1), data(:,2));
plot(x,y);

Categories

Find more on イメージ in Help Center and File Exchange

Products


Release

R2023a

Community Treasure Hunt

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

Start Hunting!