2015-05-22 112 views
0

我試圖去除兩幅圖像中的照度變化。我的一個辦法是:rgb圖像的規範化

1) There are two images im1 and im2. Extract the R G B content of im1. 
    2)Calculate the normalized value for each content 
    3)Reform a color image. 
    4)Repeat the process for im2 
    5)Compare each pixel and replace the content of im2 with im1. 

Image_rgb = imread('aswathy_33_crop.jpg'); 
Image_rgb = double(Image_rgb); 
figure;imshow(uint8(Image_rgb)); 

Image_red = Image_rgb(:,:,1); 
Image_green = Image_rgb(:,:,2); 
Image_blue = Image_rgb(:,:,3); 


[row,col] = size(Image_rgb(:,:,1)); 

for y = 1:row 
for x = 1:col 
    Red = Image_red(y,x); 
    Green = Image_green(y,x); 
    Blue = Image_blue(y,x); 


    if(Red == 0 && Green==0 && Blue==0) 
     Red = 1; 
     Green = 1; 
     Blue = 1; 
    end 

     NormalizedRed = Red/(Red + Green + Blue); 
     NormalizedGreen = Green/(Red + Green + Blue); 
     NormalizedBlue = Blue/(Red + Green + Blue); 

Image_red(y,x) = NormalizedRed; 
Image_green(y,x) = NormalizedGreen; 
Image_blue(y,x) = NormalizedBlue; 
    end 
end 
Image_rgb(:,:,1) = Image_red; 
Image_rgb(:,:,2) = Image_green; 
Image_rgb(:,:,3) = Image_blue; 

new_image1 = cat(3, Image_rgb(:,:,1) ,Image_rgb(:,:,2), Image_rgb(:,:,3)); 

figure; imshow(uint8(255*new_image1)); 

這是單個圖像,其在與完全扭曲最終崩潰image.Can有人建議我要去的地方錯了,是否只歸我的辦法處理這一問題是對還是不?

enter image description here

輸入1

enter image description here

輸入2

+0

不知道你實際上是試圖實現,但如果你想刪除光照不均勻,你可以看看我的答案在這裏... http://stackoverflow.com/questions/27891944/detect-quite-brighter-spots-on-the-image/27893051#27893051 –

+0

@Mark Setchell我在這篇文章中添加了兩張圖片。這兩幅圖像是相同的,並且在相同的情況下拍攝。但是我們可以看到它有一個顏色變化,這是由於照明的差異。我想從圖像中刪除這兩個看起來相似。 –

+0

'New_Image = rgb2gray(Image_rgb)'? –

回答

0

您的代碼看起來不錯。但有兩件事。在最後的錯誤是一個錯字unit8應該是uint8還,因爲圖像是標準化的,其值應該是0和1之間,所以你也許應該由255

figure; imshow(uint8(255*new_image1)); 

乘他們,我也不能確定你從哪裏得到你的歸一化方程式。像素值應該是

rgb_sum = Red + Green + Blue; 
    NormalizedRed = Red/rgb_sum; 
    NormalizedGreen = Green/rgb_sum; 
    NormalizedBlue = Blue/rgb_sum; 

因爲在每一個像素的歸一化空間R + B + G = 1。運行這個簡單的代碼,我們可以看到,使用的sqrt(平方和)不服從正常化

%sums the normalizes R,G,B values for all pixels 
flat = sum(new_image1,3); 
min(flat(:)) 
max(flat(:)) 

對於一個真正的標準化RGB圖像,兩者的最小值和最大值應該是1(+ - 舍入誤差)的含義所有元素的所有顏色分量總和爲1。與開方使用你的代碼總和不等於1爲每個像素

編輯

現在我更好地理解你的問題,你正試圖將兩個圖像(紅色和灰色的)比較並儘可能使它們相似。我不認爲有一種簡單的方法可以在RGB色彩空間中做到這一點。一種替代方案是YCbCr色彩空間。像RGB它有3個通道,他們是亮度(灰度圖像)紅色差異藍色差異你會看到,兩個圖像的亮度通道幾乎相同。真正的區別在於顏色通道。下面是一些示例代碼,向您展示YCbCrSpace樣子

sidebyside = [red_im,grey_im]; 

%converts to new colorspace 
YUVsidebyside = rgb2ycbcr(sidebyside); 

%display results 
figure(); 
subplot(2,2,1);imshow(sidebyside);title('original images side by side'); 
subplot(2,2,2);imshow(YUVsidebyside(:,:,1));title('Luminance channel'); 
subplot(2,2,3);imshow(YUVsidebyside(:,:,2));title('Blue Difference channel'); 
subplot(2,2,4);imshow(YUVsidebyside(:,:,3));title('Red Differrence channel'); 

enter image description here

+0

我根據您的信息編輯了代碼,但仍然得到一個根本沒有任何信息的輸出。我想正常化是爲了消除不均勻的照明。但是,這種方法是否會適用於這種輸出。 –

+0

請檢查我的編輯,看看它是否修復你的照明變化 – andrew