画像の各ピクセルの輝度を数字の行列で表したときに、全てのピクセルについて表示されない。
3 views (last 30 days)
Show older comments
jpegFiles = dir('*.jpg');
numfiles = size(jpegFiles,1); % フォルダ内のファイルの数
mydata = cell(1, numfiles);
for k = 1:numfiles
mydata{k} = imread(jpegFiles(k).name);
RGB = imread(jpegFiles(k).name);
T{k} = rgb2gray(RGB);
end
T{1}
上記のコードで、720×480の画像データを処理しているのですが、全てのピクセルについて表示されていませんでした。確認した方法としては、エクセルに出力し、出力したセルの数値の合計と、全てのセルの数値の平均×画像のピクセル数(720×480)の結果を比較したときに、一致しなかったことから、全てのピクセルについて表示されていないことが分かりました。これを解決するには、どのようなコードで処理をするべきですか。よろしくお願いします。
0 Comments
Answers (1)
Atsushi Ueno
on 6 Dec 2023
>全てのセルの数値の平均×画像のピクセル数 = 出力したセルの数値の合計(にならない)
こちらでもMATLABのサンプル画像で試したところ、問題が再現する様な画像が33枚中1枚見つかりました。
その原因を確認したところ、浮動小数点数(double型)の誤差(最後の1bitだけ異なる)が原因でした。
>これを解決するには、どのようなコードで処理をするべきですか。
このような一致性を確認する場合は、整数型で演算しなければなりません。例えば下記の例では、全てのセルの数値を64bit整数型にキャストし、1000000000倍してから平均値を整数値として計算する事によって、誤差をゼロにする事ができます。
cd /MATLAB/toolbox/images/imdata/
jpegFiles = dir('*.jpg');
numfiles = size(jpegFiles,1); % フォルダ内のファイルの数
mydata = cell(1, numfiles);
for k = 1:numfiles
RGB = imread(jpegFiles(k).name);
T{k} = rgb2gray(RGB);
% 全てのセルの数値の平均×画像のピクセル数 = 出力したセルの数値の合計か?
if(mean(T{k},"all") * prod(size(T{k})) ~= sum(T{k},"all"))
k % 15枚目に不一致が発生した!
end
end
format longEng
a = mean(T{15},"all") % 全てのセルの数値の平均
b = prod(size(T{15})) % 画像のピクセル数
c = sum(T{15},"all") % 出力したセルの数値の合計
d = a * b % c と d は同じ値に見える
d - c % ところが引き算しても結果がゼロにならない!
typecast(d, 'uint64') % c と d の LSB 1bit が異なる!
typecast(c, 'uint64') % c と d の LSB 1bit が異なる!
a = uint64(mean(uint64(T{15}).*1e+10,"all")) % 整数型にすれば誤差なく演算できる
a * b / 1e+10 - c
montage(T); % 下図の画像について確認したが、15枚目以外は全て一致した
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!