画像の各ピクセルの輝度を数字の行列で表したときに、全てのピクセルについて表示されない。
10 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
Categories
Find more on イメージ算術 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!