元の行列と同じサイズでjpeg画像を保存することはできますか?
11 views (last 30 days)
Show older comments
test(214×407×3 uint8)をimshowで表示して、同じサイズ(214×407)の画像を保存することは可能ですか?
下記のコードでは、保存した画像が334×636で、元の行列と異なってしまいました。また、余白はなしで保存したいです。保存後に、画像を呼び出して、元とサイズ・値が同じ行列を得たいです。
何かご存じのことありましたら、ご教示いただきたいです。よろしくお願いいたします。
fig=figure;
imshow(test,'Border','tight');
path_jpeg = 'C:\Users\...\';
filename_jpeg = [path_jpeg,num2str(i)];
saveas(fig,filename_jpeg,'jpeg')
2 Comments
Atsushi Ueno
on 21 Oct 2023
「なぜ質問の方法では目的通りにならないのか」原因が分かったら回答に記入致します。
load('test.mat');
path_jpeg = '.';
filename_jpeg = [path_jpeg,filesep,num2str(1),'.jpeg'];
imwrite(test,filename_jpeg,'jpeg');
test2 = imread(filename_jpeg); % saveas 関数ではなくimwrite 関数を使う
size(test) == size(test2) % イメージデータのサイズは一致した
imshow(double(test == test2)); % 見た目は同じだが、イメージデータは完全に一致しない
Hiroshi Iwamura
on 21 Oct 2023
saveas() は表示されたfigureの保存に使います。
ボーダーや、colorbarが表示されていればそれごと保存されますので、イメージ部分より大きくなります。
Uenoさんが示されたとおり、イメージ行列のみの保存にはimwrite()を使ってください。
Accepted Answer
Hiroshi Iwamura
on 21 Oct 2023
Moved: Atsushi Ueno
on 21 Oct 2023
非圧縮で保存したい場合はtifを使うなどします。
jpg等のロスレスモードも指定できますが、一般的なビューアーではサポートされていないこともあります。
load('test.mat');
imwrite(test,"image.tif",'tif')
I2 = imread("image.tif");
max(abs(test-I2),[],'all')
imwrite(test,"image.jpg",Mode="lossless")
I3 = imread("image.jpg");
max(abs(test-I3),[],'all')
データ自体の保存目的であれば、画像データとして保存する必要はないかとは思いますが。
3 Comments
More Answers (0)
See Also
Categories
Find more on Convert Image Type in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!