web-dev-qa-db-ja.com

変更した画像をMATLABに保存するにはどうすればよいですか?

画像をMATLABに読み込み、その上に長方形を描画してから、画像を保存したいと思います。

また、MATLABを学んでいるところです。優しくしてください。シンプルなはずなのに、出来ないようです。

_im = imread('image.tif');
imshow(im);
rectangle('Position', [100, 100, 10, 10]);
imwrite(im, 'image2.tif');
_

画像上に長方形が見えますが、保存した画像には長方形が表示されません。画像を保存して長方形を表示するにはどうすればよいですか?

FWIW、私はすでにsaveas()を試しましたが、それは私に巨大なイメージを与えます。 saveas()を使用して、保存した画像を正しいサイズにする方法はありますか?

13
jacobko

実際には The MathWorksサイトのバグ この問題についてです。残念ながら、彼らは本当の答えを綴っていません(私見、あなたのモニターに定規をかざすのは本当の解決策ではないので)。

printコマンドを使用して、保存された画像のサイズが入力画像のサイズと一致するまで、-rパラメーターを手動で変更する必要があります。 -rパラメーターは、保存された画像のDPIを指定します。ほとんどの画面には異なるDPIがあるため、万能のソリューションはありません。

im = imread('image.tif');
f = figure, imshow(im, 'Border', 'tight');
rectangle('Position', [100, 100, 10, 10]);
print(f, '-r80', '-dtiff', 'image2.tif');

上記のコードを使用して、-rパラメーターを正しく表示されるまで微調整し、無効にします。

10
jacobko

保存された画像に長方形が表示されない理由は、画像データを格納する変数imを変更していないためです。長方形は、プロットされた画像の上に表示される単なるプロットオブジェクトです。画像データ自体を変更する必要があります。

通常、MATLABに読み込まれた画像は、N行M行3列の行列として読み込まれます(つまり、各ピクセルにRGB(赤-緑-青)値を持つN行M列のピクセル画像)。通常、画像データはuint8データ型であるため、RGB値の範囲は0〜255です。特定のピクセルのRGB値を変更する場合は、次のようにします。

im = imread('test.jpg');  % Load a jpeg image
im(1,1,1) = 255;  % Change the red value for the first pixel
im(1,1,2) = 0;    % Change the green value for the first pixel
im(1,1,3) = 0;    % Change the blue value for the first pixel
imwrite(im,'new.jpeg');  % Save modified image

一度に複数のピクセル(つまり、長方形の領域)を変更するには、さまざまな方法があります。そのため、 多次元配列 にインデックスを付ける方法を調べる必要があります。さまざまなタイプの画像がMATLABに読み込まれる方法の詳細(つまり、 truecolor vs. indexed )については、ドキュメントで imread を確認します。

19
gnovice

上の質問には、matlabが提供する非常に簡単な解決策があります。

% you so far

im = imread('image.tif');
imshow(im);
rectangle('Position', [100, 100, 10, 10]);

% now you use "getframe" and "frame2im"

f = getframe(gca);
im = frame2im(f);

imwrite(im,'image2.tif');

画像に長方形を描いて保存しようとしたとき、それは私にとって素晴らしいことでした。それを使い続けたい場合は、追加するだけです

imread('image2.tif');

そしてそれで働き続けます:)

よろしく、ローラ

13
Laura

フォローアップ jacobko 答え。図paperpositionおよびpaperunitsプロパティと軸unitsおよびpositionプロパティは通常、解像度を微調整することなく、望ましい結果をもたらします。そう、

>> im = imread('image.tif');
>> f = figure, imshow(im);
>> r=rectangle('Position',[100, 100,10,10]);
>> set(r,'edgecolor','b') % change the color of the rectangle to blue
>> set(f,'units','centimeters','position',[1 1 2.5 2.5]) % set the screen size and position
>> set(f,'paperunits','centimeters','paperposition',[1 1 2.5 2.5]) % set size and position for printing
>> set(gca,'units','normalized','position',[0 0 1 1]) % make sure axis fills entire figure
>> print(f, '-r80','-dtiff','image2.tif')

出力画像image2.tifは、軸の周りに境界線がない場合、80dpiの解像度で2.5cm x2.5cmになります。

7
Azim

Imを保存する場合は、最初にその値を変更する必要があります。矩形関数についてはよく知りませんが、次のことができます(ブルートフォース)。

im = imread('image.tif');
im(100:110,100)=0;
im(100:110,110)=0;
im(100,100:110)=0;
im(110,100:110)=0;
imshow(im);
imwrite(im, 'image2.tif');

上記のコードはグレースケール画像用であることに注意してください。画像がRGB画像の場合は、次の手順を実行する必要があります。

 im(100:110,100,:)=0;
 ....
3
LiorH

getframeを使用して、変更された画像をFigureウィンドウから取得できる場合があります。 getframeから返された構造体のcdataフィールドとcolormapフィールドをそれぞれ画像とそのカラーマップとしてimwriteに渡すことができると思います。

2
SCFrench
[f,p] = uigetfile('*.*');
I = imread([p,f]);
imwrite(I,'img12.tif');%

画像を保存するために付けることができる任意の名前

自動的にフォルダに保存され、任意の画像を閲覧できます。

2
Som
close all; clear; clc;

r = 240 ; c = 320;

fig = figure('Visible', 'off');
imshow( zeros(r,c) );
hold on;
plot([c-fix(c/2),c-fix(c/2)],[r-fix(r/2),r-fix(r/2)],'r*', 'MarkerSize', 10 );

% Sets position and size of figure on the screen
set(fig, 'Units', 'pixels', 'position', [100 100 c r] ); 

% Sets axes to fill the figure space
set(gca, 'Units', 'pixels', 'position', [0 0 c+1 r+1 ]);

% Sets print properties; Looks like 1 pixel = (3/4)th of a point
set(fig, 'paperunits', 'points', 'papersize', [fix((c-1)*(3/4))+1 fix((r-1)*(3/4))+1]);
set(fig, 'paperunits', 'normalized', 'paperposition', [0 0 1 1]);

print( fig, sprintf('-r%d', ceil(72*(4/3))), '-dpng', 'image.png' ); 


im = imread( 'image.png');
figure; imshow(im);
1
laks