2012-06-13 55 views
14

此問題與我之前發佈的文章Image Processing Algorithm in Matlab有關,它已經得到了我想要的結果。處理過的圖像中的文物

但現在我面臨着另一個問題,並在過程圖像中獲取一些文物。在我的原始圖像(600個圖像的堆棧)我看不到任何文物,請從指甲看原圖:

enter image description here

但在我10分處理的結果,我可以看到這幾行:

enter image description here

我真的不知道他們從哪裏來?

此外,如果他們屬於相機的傳感器,爲什麼我不能看到他們在我的原始圖像?任何想法?

編輯:

我已經加入由@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個圖像和黑色的背景大小4幅圖像(1280×1024):

image1 image2 image3 iamge4

這裏是黑色背景:

blackbackground1 blackbackground2 blackbackground3

+1

當您從以下答案中找到解決方案時,請將其作爲答案發布。這是一個奇怪的問題:) –

+0

我可以問你打算如何處理這些視頻? PPG相關的東西? –

+0

@Georg閱讀我以前的帖子在stackoverflow:圖像處理Algorithem在Matlab – user261002

回答

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) 

這裏是圖像過濾

Filtered Image

之後,這表明受過濾

Pixels affected by filter

2

沒有真正挖掘到你的圖像處理,我能想到的兩個原因發生:

  1. 處理介紹這些文物。這不太可能,但它是一種選擇。檢查你的算法和你的代碼。

  2. 這是一個副作用,因爲您的處理減少了圖片的動態範圍,就像量化一樣。所以實際上,這些工件在處理之前可能已經在圖片本身中,但是它們不能被注意到,因爲它們的水平非常接近背景水平。至於這些工件的來源,它甚至可能是相機本身。

+0

只是一個想法:有時候,Matlab圖像顯示看起來很奇怪,有些文物實際上並不存在。嘗試全屏顯示它,或者檢查圖像矩陣以查看實際在線位置是否獲得255灰度值。 – CTZStef

+0

@CTZStef好點,也許有代碼中的錯誤。我重新回答了一些問題以解決這個問題。 –

5

你可以使用某種morphologicalopening除去細的垂直線:

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

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

screenshot

結構元素所用的是:

>> SE.getnhood 
ans = 
    1  1  1 
+1

這很不錯,但似乎輸入的輸出質量相當丟失。 – trumpetlicks

13

你的文物是實際上存在於你的原始圖像中,雖然不是可見。 代碼在數學:

i = [email protected]"http://i.stack.imgur.com/5hM3u.png" 

enter image description here

EntropyFilter[i, 1] 

enter image description here

的線是微弱的,但是你可以通過二值化水平非常低門檻看到他們:

Binarize[i, .001] 

enter image description here

至於什麼是造成他們,我只能推測。我會從相機輸出本身開始追蹤。此外,您可以發佈兩個或三個「直接來自相機」的圖像,以便我們進行一些試驗。

+4

好抓。事實上,如果你仔細觀察原始圖像,你會看到微弱的線條。只需靠近顯示器並以不同程度傾斜你的頭像:) – Amro

+3

@Amro嗨!遺憾的是我的編碼比我的視力好得多。這並不意味着_anything_關於我的編碼能力:) –

+0

@belisarius感謝您的回覆。是的,你是對的。我剛剛嘗試了entropyfilt()從matlab和我得到了相同的結果 – user261002

7

您使用的相機很可能有一個CMOS芯片。由於它們具有獨立的列(可能是行)放大器,這些放大器可能具有略微不同的電子特性,所以您可以從一列中獲得比另一列更強的信號。

根據相機的不同,色譜柱強度的變化可以保持穩定。在這種情況下,你很幸運:拍攝100張黑暗的圖像(在鏡頭上膠帶),對它們進行平均,然後在運行分析前從每幅圖像中減去它們。這應該會使線條消失。如果線條不消失(或者有更多線條),則使用post-processing scheme proposed by Amro在二值化之後移除線條。

編輯

這裏是你會怎麼做背景減法,假設你已經採取100幅深色圖像,並將它們存儲在單元陣列D有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) 
+0

哇,這是偉大的,我要去做,然後很快就會回到你身邊。我的相機也是Mikrotron compnay的EoSen MC1362。你是對的它是CMOS攝像頭 – user261002

+0

hi @Jonas我用以下代碼拍攝了圖像:%圖像平均值 im = D {1}(:, :); for i = 2:100 im = imadd(im,D {i}(:, :)); end im = im/100; imshow(im,[]);但我不確定你的減法是什麼意思?你的意思是我需要從原始圖像中減去這個平均值嗎? – user261002

+0

我編寫了新代碼,它並沒有消除這些行。 ( – user261002

1

這是一個非常有趣的問題像素。我曾經用現場紅外成像儀(視頻系統)處理這類問題。我們實際上已經在攝像頭內置了算法來處理這個問題,然後用戶就會看到或拿到手中的圖像。幾個問題:

1)你處理RAW圖像還是處理已經預處理的灰度(或RGB)圖像?

2)這些圖像的最終目標是什麼?目標是簡單地擺脫線條,而不管圖像其餘部分的質量如何,或者是保持絕對最佳圖像質量的關鍵。之後您是否要執行其他處理?

我同意這些行很可能在您的所有圖像。這些線條出現在圖像中有兩個原因,一個是明亮的場景,其中列的運算放大器飽和,從而導致圖像的整列獲得最亮值的相機可以輸出。另一個原因可能是運算放大器或ADC(模數轉換器)本身不好(很可能不是ADC,因爲通常情況下,整個傳感器基本上只有一個ADC,這會使整個圖像變壞,而不是您的情況)。飽和情況實際上更難以處理(我不認爲這是你的問題)。注意:傳感器上的飽和度太高會導致傳感器出現壞像素和列(這就是爲什麼他們說永遠不要將您的相機指向太陽)。壞列問題可以處理。上面在另一個答案中,有人讓你平均圖像。雖然這可能很好地找出壞列(或不好的單個像素或傳感器的噪聲矩陣)在哪裏(並且您將不得不平均地將相機指向黑色,白色,基本上純色),但它不是'正確的答案擺脫他們。順便說一下,我正在用黑白和平均值來解釋,並發現壞像素等......被稱爲校準傳感器。

好的,所以說你可以得到這個校準數據,那麼你將能夠找出哪些列是壞的,甚至是單個像素。

如果您有這方面的數據,一個辦法,你可以刪除列,具體是:

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剩餘的平均替換不良像素它周圍的像素好。以上是算法的過度簡化版本。當然有一些情況,一個單獨的壞點可能正好位於壞列的旁邊,不應該用於平均值,或者兩個或三個壞列緊挨着。可以想象,你會計算一個壞列的值,然後認爲該列是好的,以移動到下一個糟糕的列等...

現在,我問起RAW與B的原因/ W或RGB。如果您正在處理RAW,根據傳感器本身的構造,拜爾濾波的圖像傳感器可能只有一個子像素(如果您願意)具有較差的運算放大器。如果你可以檢測到這一點,那麼你不一定要扔掉其他好的子像素的數據。其次,如果您使用RGB傳感器,拍攝灰度照片,並且您使用RAW拍攝,則可以計算自己的灰度像素。當使用RGB傳感器時,許多傳感器在返回灰度圖像時,將簡單地傳回Green像素作爲整個像素。這是因爲它確實用作圖像的發光。這就是爲什麼大多數圖像傳感器爲每個r或g子像素實現2個綠色子像素的原因。如果這是他們正在做的事情(不是所有的傳感器都這樣做),那麼你可能有更好的運氣擺脫壞通道列,並使用自己的灰度轉換。

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

道歉了很長的解釋,但我希望這仍然是信息的人:-)

0

既然你不能看到原始圖像中的線條,他們要麼有低強度差與原始圖像範圍進行比較,或者通過您的處理算法添加。

干擾的形狀提示第一個選項...(除非你有單獨處理每一行的算法。)

好像你傳感器的列不統一,試圖拍照,而不手指(僅用於背景)使用相同的曝光(和其他)設置,然後從手指的照片中將其減去(在其他處理之前)。 (在拍攝兩張圖像之前,請確保背景均勻。)