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

조회 수: 4 (최근 30일)
suzuka iwaki
suzuka iwaki 2023년 12월 6일
답변: Atsushi Ueno 2023년 12월 6일
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)の結果を比較したときに、一致しなかったことから、全てのピクセルについて表示されていないことが分かりました。これを解決するには、どのようなコードで処理をするべきですか。よろしくお願いします。

답변 (1개)

Atsushi Ueno
Atsushi Ueno 2023년 12월 6일
>全てのセルの数値の平均×画像のピクセル数 = 出力したセルの数値の合計(にならない)
こちらでも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枚目以外は全て一致した

카테고리

Help CenterFile Exchange에서 イメージ에 대해 자세히 알아보기

제품


릴리스

R2023b

Community Treasure Hunt

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

Start Hunting!