14

この質問は、スタックオーバーフローでのMatlabでの以前の投稿の画像処理アルゴリズムに関連しています。これは私が望んでいた結果をすでに得ています。

しかし今、私は別の問題に直面しており、プロセス画像にいくつかのアーティファクトが含まれています。私の元の画像(600枚の画像のスタック)では、アーティファクトが見当たりません。指の爪からの元の画像をご覧ください。

ここに画像の説明を入力してください

しかし、私の10の処理結果では、次の行を見ることができます。

ここに画像の説明を入力してください

彼らがどこから来たのか本当にわかりませんか?

また、それらがカメラのセンサーに属している場合、元の画像でそれらを見ることができないのはなぜですか?何か案が?

編集:

@Jonasによって提案された次のコードを追加しました。アーティファクトは減少しますが、完全に除去されるわけではありません。

%averaging of images
im = D{1}(:,:);
for i = 2:100
 im = imadd(im,D{i}(:,:));
end
im = im/100;
imshow(im,[]);

for i=1:100
SD{i}(:,:)=imsubtract(D{i}(:,:),im(:,:))
end

@belisariusがさらに多くの画像を要求したので、スペックルパターンのある指から4つの画像をアップロードし、黒い背景サイズ(1280x1024)から4つの画像をアップロードします。

image1 image2 image3 iamge4

そして、これが黒い背景です:

blackbackground1 blackbackground2 blackbackground3

4

7 に答える 7

13

アーティファクトは実際には元の画像に存在しますが、表示されません。Mathematicaのコード:

i = Import@"http://i.stack.imgur.com/5hM3u.png"

ここに画像の説明を入力してください

EntropyFilter[i, 1]

ここに画像の説明を入力してください

線はかすかになっていますが、非常に低いレベルのしきい値で2値化することで確認できます。

Binarize[i, .001] 

ここに画像の説明を入力してください

それらを引き起こしているものについては、私は推測することしかできません。カメラ出力自体からトレースを開始します。また、実験のために、「カメラから直接届く」2つまたは3つの画像を投稿することもできます。

于 2012-06-13T13:43:44.513 に答える
7

使用しているカメラは、おそらくCMOSチップを搭載しています。それらは独立した列(および場合によっては行)の増幅器を備えており、電子特性がわずかに異なる可能性があるため、ある列からの信号を別の列よりも増幅して得ることができます。

カメラによっては、これらのカラム強度の変動は安定している可能性があります。その場合、運が良かったです。分析を実行する前に、最大100枚の暗い画像を撮影し(レンズに何かをテープで貼り付け)、それらを平均してから、各画像から差し引きます。これにより、線が消えるはずです。行が消えない場合(または追加の行がある場合)、Amroによって提案された後処理スキームを使用して、2値化後に行を削除します。

編集

D100個の暗い画像を撮影し、それらを100個の要素を持つセル配列に保存したと仮定して、バックグラウンド減算を行う方法は次のとおりです。

% take the mean; convert to double for safety reasons
meanImg = mean( double( cat(3,D{:}) ), 3); 

% then you cans subtract the mean from the original (non-dark-frame) image
correctedImage = rawImage - meanImg; %(maybe you need to re-cast the meanImg first)
于 2012-06-13T14:25:55.130 に答える
5

ある種の形態学的 開口部を使用して、細い垂直線を削除できます。

img = imread('image.png');
SE = strel('line',2,0);
img2 = imdilate(imerode(img,SE),SE);

subplot(121), imshow(img)
subplot(122), imshow(img2)

スクリーンショット

使用された構造要素は次のとおりです。

>> SE.getnhood
ans =
     1     1     1
于 2012-06-13T13:21:45.473 に答える
5

これは、意見として、上記の方法よりも穏やかに線を削除するという答えです。

im = imread('image.png');   % Original image
imFiltered = im;            % The filtered image will end up here
imChanged = false(size(im));% To document the filter performance 

% 1)
% Compute the histgrams for each column in the lower part of the image
% (where the columns are most clear) and compute the mean and std each
% bin in the histogram.
histograms = hist(double(im(501:520,:)),0:255);
colMean = mean(histograms,2);
colStd = std(histograms,0,2);

% 2)
% Now loop though each gray level above zero and...
for grayLevel = 1:255

    % Find the columns where the number of 'graylevel' pixels is larger than
    % mean_n_graylevel + 3*std_n_graylevel). - That is columns that contains
    % statistically 'many' pixel with the current 'graylevel'. 
    lineColumns = find(histograms(grayLevel+1,:)>colMean(grayLevel+1)+3*colStd(grayLevel+1));

    % Now remove all graylevel pixels in lineColumns in the original image
    if(~isempty(lineColumns))
        for col = lineColumns 
            imFiltered(:,col) = im(:,col).*uint8(~(im(:,col)==grayLevel));
            imChanged(:,col) = im(:,col)==grayLevel;
        end
    end 
end

imshow(imChanged)
figure,imshow(imFiltered)

これがフィルタリング後の画像です

フィルタリングされた画像

そしてこれはフィルターの影響を受けたピクセルを示しています

フィルタの影響を受けるピクセル

于 2012-06-15T19:42:50.980 に答える
2

あなたの画像処理を実際に掘り下げることなく、私はこれが起こる2つの理由を考えることができます:

  1. 処理により、これらのアーティファクトが導入されました。これはありそうにありませんが、オプションです。アルゴリズムとコードを確認してください。

  2. 量子化と同じように、処理によって画像のダイナミックレンジが減少するため、これは副作用です。したがって、実際には、これらのアーティファクトは処理前に画像自体にすでに含まれている可能性がありますが、それらのレベルが背景レベルに非常に近いため、それらに気付くことはできませんでした。これらのアーティファクトの原因については、カメラ自体である可能性もあります。

于 2012-06-13T12:19:14.047 に答える
1

これは非常に興味深い質問です。私は以前、ライブIRイメージャ(ビデオシステム)でこの種の問題に対処していました。実際には、ユーザーが画像を見たり手に取ったりする前に、この問題に対処するためのアルゴリズムがカメラに組み込まれていました。カップルの質問:

1)RAW画像を扱っていますか、それともすでに前処理されたグレースケール(またはRGB)画像を扱っていますか?

2)これらの画像の最終的な目標は何ですか。結果として得られる画像の残りの部分の品質に関係なく、単に線を取り除くことが目標であるか、または絶対的な最高の画像品質を維持するためのポイントです。後で他の処理を実行しますか?

これらの線がすべての画像に含まれている可能性が高いことに同意します。これらの線が画像に表示される理由は2つあります。1つは、列のOP AMPが飽和し、画像の列全体がカメラが出力できる最も明るい値を取得する明るいシーンにある場合です。もう1つの理由は、OP AMPまたはADC(アナログ-デジタルコンバーター)自体が不良である可能性があります(通常、センサー全体に1つのADCがあり、画像全体が不良になるため、ADCではない可能性があります)。飽和状態の場合は、実際には対処がはるかに困難です(これがあなたの問題ではないと思います)。注:センサーの彩度が高すぎると、センサーに不良ピクセルや列が発生する可能性があります(そのため、カメラを太陽に向けないように言われています)。不良カラムの問題に対処できます。上記の別の答えでは、誰かがあなたに画像を平均化してもらいました。これは、悪い列(または悪い単一ピクセル、またはセンサーのノイズマトリックス)がどこにあるかを見つけるのに良いかもしれませんが(そして、カメラを平均して黒、白、本質的に単色に向ける必要があります)、そうではありません。それらを取り除くための正しい答え。ちなみに、白黒や平均化、ドット抜けなどで説明しているのは、センサーのキャリブレーションといいます。

OK、つまり、このキャリブレーションデータを取得できると言うと、単一のピクセルであっても、どの列が不良であるかを見つけることができます。

このデータがある場合、列を消去する1つの方法は次のとおりです。

for each bad column
    for each pixel (x, y) on the bad column
        pixel(x, y) = Average(pixel(x+1,y),pixel(x+1,y-1),pixel(x+1,y+1),
                              pixel(x-1,y),pixel(x-1,y-1),pixel(x-1,y+1))

これが本質的に行うことは、不良ピクセルを、その周囲に残っている6つの良好なピクセルの平均である新しいピクセルに置き換えることです。上記は、アルゴリズムの過度に単純化されたバージョンです。確かに、1つだけ悪いピクセルが悪い列のすぐ隣にあり、平均化に使用すべきではない場合や、2つまたは3つの悪い列が隣り合っている場合があります。不良列の値を計算し、次の不良列に進むためにその列が適切であると見なすと想像できます。

さて、RAWとB/WまたはRGBについて尋ねた理由。RAWを処理している場合、センサー自体のビルドによっては、バイエルフィルター処理されたイメージセンサーの1つのサブピクセル(使用する場合)のみが不良OPAMPを持っている可能性があります。これを検出できれば、必ずしも他の適切なサブピクセルのデータを破棄する必要はありません。次に、RGBセンサーを使用してグレースケール写真を撮影し、それをRAWで撮影した場合、独自のグレースケールピクセルを計算できる場合があります。RGBセンサーを使用しているときにグレースケール画像を返す場合、多くのセンサーは単に緑のピクセルを全体のピクセルとして返します。これは、それが実際に画像の発光として機能するという事実によるものです。これが、ほとんどのイメージセンサーがrまたはgサブピクセルごとに2つの緑色のサブピクセルを実装する理由です。

gray = (0.299*r + 0.587*g + 0.114*b)

長い間答えてしまったことをお詫びしますが、これがまだ誰かに情報を提供することを願っています:-)

于 2012-06-16T06:06:38.457 に答える
0

元の画像では線が見えないため、元の画像範囲と比較して強度の差が小さいか、処理アルゴリズムによって追加された線があります。

外乱の形状は、最初のオプションを示唆しています...(各行を個別に処理するアルゴリズムがない場合)。

センサーの列が均一ではないようです。同じ露出(およびその他)の設定を使用して、指なし(背景のみ)で写真を撮り、それを指の写真から差し引いてみてください(他の処理の前)。(両方の画像を撮影する前に、背景が均一であることを確認してください。)

于 2012-06-17T13:08:28.077 に答える