0

白いピクセルを含むカメラからのRGB画像があります。私はそれらを排除するために次のコードを書きました。それは動作しますが、永遠にかかります。

% elliminate white pixel    
while 1
    maxValue = max(imageRGB(:));        
    [maxY maxX] = maxPosition(squeeze(imageRGB(:,:,c)));
    surr = 2;
    x_l = maxX - surr; if x_l < 1, x_l = 1; end
    x_r = maxX + surr; if x_r > size(imageRGB,2), x_r = size(imageRGB,2); end
    y_u = maxY - surr; if y_u < 1, y_u = 1; end
    y_b = maxY + surr; if y_b > size(imageRGB,1), y_b = size(imageRGB,1); end
    meanArea = ((y_b-y_u)+1) * ((x_r-x_l)+1) - 1;
    mean = (sum(sum(imageRGB(y_u:y_b, x_l:x_r,c))) - maxValue)/meanArea;        
    if (maxValue/mean > 1.5)
        imageRGB(maxY,maxX,c) = mean;
    else
        break;
    end
end

このコードを高速化する方法はありますか?

4

3 に答える 3

2

私が間違っている場合は修正するか、この「回答」を完全に無視してください。ただし、投稿されたコードは次のように表示されます。

  1. 画像内で最も白いピクセルを見つけます (ここでimageRGBは推測していますが、Matlab の組み込みではありません)。
  2. 画像内で最も白いピクセルの位置を見つけます (別の推測、別の未知の関数maxPosition)。
  3. 最も白いピクセルをそのすぐ近くの平均に置き換えるために、何らかの平均化を行います。
  4. 停止基準が満たされるまでプロセスを繰り返します。

Image Processing Toolbox をお持ちの場合は、ピクセル強度を調整するためのあらゆる種類の関数があることがわかります。これは、あなたがやろうとしていることだと思いますので、この回答を読むのをやめてください。ツールボックスをお持ちでない場合は、読み進めてください。

可能であれば、アプローチ全体を修正し、画像の 1 回の読み取りから、平均化のしきい値を決定する必要があります。これにより、 の計算がmaxValueループから外れ、 の単一の計算に置き換えられる可能性がありthresholdValueます。[maxY maxX]次に、ループからの計算も持ち上げることができます。

これができない場合でも、操作の速度を上げるためのオプションがいくつかあります。次のいずれかを実行できます。

  • 操作を開始する前に、画像全体を 2 ピクセルのハローで埋めます。次に、元の画像のすべての白いピクセルに操作を適用します。明らかに、ハロー ピクセルを適切な値に設定して、操作を変更しないようにする必要があります。

また

  • エッジから 2 ピクセル以内にない画像内のピクセルのみを操作します。これにより、各次元で 4 ピクセル小さい出力画像が生成されますが、大きな画像ではこれは多くの場合問題になりません。

ifこれらのいずれかにより、大量のステートメントと繰り返し計算が不要meanAreaになります (定数になるため)。

しきい値を繰り返し再計算するのではなく、処理の開始時に一度計算できる場合は、画像内のすべてのピクセルに適用できる平均化を実装する関数を記述できることがわかり、見つける必要がなくなります。白いピクセル。もちろん、関数は非白のピクセルをそのままにしておく必要があります。すべてのピクセルに操作を適用し、変更してはならないピクセルの null 操作 (またはそれらのピクセルの恒等操作) であることを確認することは、変更が必要なピクセルを最初に見つけてから操作を適用するよりも高速な場合があります。それらのピクセルにのみ。

于 2012-08-07T12:28:34.383 に答える
1
  • 私が知っていることから、ifパフォーマンスは良くありません。

あなたは置き換えることができます

 x_l = maxX - surr; if x_l < 1, x_l = 1; end

 x_l = max(maxX - surr,1); 

と他の類似。

(maxValue/mean > 1.5)また、whileループの条件を設定することもできます。


  • 行で

    maxValue = max(imageRGB(:));
    [maxY maxX] = maxPosition(squeeze(imageRGB(:、:、c)));

maxを2回検索します。次のように書くと、時間を節約できると思います。

[maxY maxX] = maxPosition(squeeze(imageRGB(:,:,c)));
 maxValue = imageRGB(maxY,maxX,c);   
于 2012-08-07T10:54:31.097 に答える
0

別の可能性は、並べ替えを削除して、画像全体の平均を計算することです。conv2これはビルトインで簡単に実行できるため、誰でも調理できるものに比べて非常に高速です。

ダブルグレースケール画像で作業していると仮定します:

% generate an averageing filter
filterMat=ones(2*filterSize+1);
filterMat=filterMat/sum(filterMat(:));

% convolve with image
meanComplete=conv2(picture,filterMat,'same');

% calculate the decision criterion
changeIndices=picture./meanComplete>relThreshold & picture>absThreshold;

% use logical indexing to replace white pixels with the mean
newPicture=picture;
newPicture(changeIndices)=mean(changeIndices);

1 つのフル HD 画像に 50 ミリ秒が必要です。

于 2012-08-07T14:11:39.597 に答える