元の行列と同じサイズ​でjpeg画像を保存​することはできますか​?

14 次查看(过去 30 天)
non
non 2023-10-21
评论: non 2023-10-22
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 个评论
Atsushi Ueno
Atsushi Ueno 2023-10-21
「なぜ質問の方法では目的通りにならないのか」原因が分かったら回答に記入致します。
目的に対して imwrite 関数を使うのがベストな手段です。サイズが一致する事は確認しました。JPEG形式は非可逆圧縮データなので元のイメージデータと完全に一致しませんでした。
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) % イメージデータのサイズは一致した
ans = 1×3 logical array
1 1 1
imshow(double(test == test2)); % 見た目は同じだが、イメージデータは完全に一致しない
Hiroshi Iwamura
Hiroshi Iwamura 2023-10-21
saveas() は表示されたfigureの保存に使います。
ボーダーや、colorbarが表示されていればそれごと保存されますので、イメージ部分より大きくなります。
Uenoさんが示されたとおり、イメージ行列のみの保存にはimwrite()を使ってください。

请先登录,再进行评论。

采纳的回答

Hiroshi Iwamura
Hiroshi Iwamura 2023-10-21
移动:Atsushi Ueno 2023-10-21
非圧縮で保存したい場合はtifを使うなどします。
jpg等のロスレスモードも指定できますが、一般的なビューアーではサポートされていないこともあります。
load('test.mat');
imwrite(test,"image.tif",'tif')
I2 = imread("image.tif");
max(abs(test-I2),[],'all')
ans = uint8 0
imwrite(test,"image.jpg",Mode="lossless")
I3 = imread("image.jpg");
max(abs(test-I3),[],'all')
ans = uint8 0
データ自体の保存目的であれば、画像データとして保存する必要はないかとは思いますが。
  3 个评论
Hiroshi Iwamura
Hiroshi Iwamura 2023-10-21
ああ、回答とコメントを特に気にせず書いてました。 (^-^;
お手数お掛けしました。
non
non 2023-10-22
Hiroshi Iwamura様・Atsushi Ueno
早速のご回答をありがとうございます。疑問は解決いたしました。
自身の目的には、saveas関数ではなく、imwrite関数を使うべきだというご指摘、大変参考になりました。また、ファイルの保存形式が、使い分けるべきだという点も、大変勉強になりました。ありがとうございました。

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 イメージ 的更多信息

产品


版本

R2021b

Community Treasure Hunt

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

Start Hunting!