画像の各ピクセルの輝​度を数字の行列で表し​たときに、全てのピク​セルについて表示され​ない。

18 views (last 30 days)
suzuka iwaki
suzuka iwaki on 6 Dec 2023
Answered: Atsushi Ueno on 6 Dec 2023
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)の結果を比較したときに、一致しなかったことから、全てのピクセルについて表示されていないことが分かりました。これを解決するには、どのようなコードで処理をするべきですか。よろしくお願いします。

Answers (1)

Atsushi Ueno
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
k = 15
format longEng
a = mean(T{15},"all") % 全てのセルの数値の平均
a =
180.545820312500e+000
b = prod(size(T{15})) % 画像のピクセル数
b =
76.8000000000000e+003
c = sum(T{15},"all") % 出力したセルの数値の合計
c =
13.8659190000000e+006
d = a * b % c と d は同じ値に見える
d =
13.8659190000000e+006
d - c % ところが引き算しても結果がゼロにならない!
ans =
1.86264514923096e-009
typecast(d, 'uint64') % c と d の LSB 1bit が異なる!
ans = uint64
4713705819181416449
typecast(c, 'uint64') % c と d の LSB 1bit が異なる!
ans = uint64
4713705819181416448
a = uint64(mean(uint64(T{15}).*1e+10,"all")) % 整数型にすれば誤差なく演算できる
a = uint64
1805458203125
a * b / 1e+10 - c
ans = uint64
0
montage(T); % 下図の画像について確認したが、15枚目以外は全て一致した

Products


Release

R2023b

Community Treasure Hunt

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

Start Hunting!