對rgb圖像中值濾波

img=imread('1.JPG');
img=double(img)/255;
[M,N,c]=size(img);
img1=zeros([M,N]);
figure,subplot 121,imshow(img);
img_noise=imnoise(img1,'salt & pepper',0.05);
subplot 122,imshow(img_noise);
img_noise=img_noise+img;
img_hsi=rgb2hsi(img);
img_noise_hsi=rgb2hsi(img_noise);
subplot 231,imshow(img_hsi(:,:,1));
subplot 232,imshow(img_hsi(:,:,2));
subplot 233,imshow(img_hsi(:,:,3));
subplot 234,imshow(img_noise_hsi(:,:,1));
subplot 235,imshow(img_noise_hsi(:,:,2));%hsi
subplot 236,imshow(img_noise_hsi(:,:,3));
figure,
subplot 231,imshow(img(:,:,1));
subplot 232,imshow(img(:,:,2));
subplot 233,imshow(img(:,:,3));
subplot 234,imshow(img_noise(:,:,1));%rgb
subplot 235,imshow(img_noise(:,:,2));
subplot 236,imshow(img_noise(:,:,3));
%matlab自帶的中值濾波函數
img_noise_i=medfilt2(img_noise_hsi(:,:,3),[3,3]);
img_noise_h=medfilt2(img_noise_hsi(:,:,1),[3,3]);
img_noise_s=medfilt2(img_noise_hsi(:,:,2),[3,3]);
%figure,imshow(img_noise_i)
img_noise_hsi2=cat(3,img_noise_hsi(:,:,1),img_noise_hsi(:,:,2),img_noise_i);
img_noise_hsi3=cat(3,img_noise_h,img_noise_s,img_noise_i);
img2=hsi2rgb(img_noise_hsi2);
img3=hsi2rgb(img_noise_hsi3);
figure,imshow(img3)%HSI三通道都濾波
figure,subplot 131,imshow(img);
subplot 132,imshow(img_noise);
subplot 133,imshow(img2),title('HSI濾波')%只對I通道濾波
%%自編中值濾波函數

img_noise_im=median_filter(img_noise_hsi(:,:,3),[3,3]);
img_noise_hm=median_filter(img_noise_hsi(:,:,1),[3,3]);
img_noise_sm=median_filter(img_noise_hsi(:,:,2),[3,3]);
%figure,imshow(img_noise_i)
img_noise_hsi2m=cat(3,img_noise_hsi(:,:,1),img_noise_hsi(:,:,2),double(img_noise_im));
img_noise_hsi3m=cat(3,img_noise_hm,img_noise_sm,img_noise_im);
img2m=hsi2rgb(img_noise_hsi2m);
img3m=hsi2rgb(double(img_noise_hsi3m));
figure,imshow(img3m)%HSI三通道都濾波
figure,subplot 131,imshow(img);
subplot 132,imshow(img_noise);
subplot 133,imshow(img3m),title('HSI濾波')%只對I通道濾波
%rgb
r=img_noise(:,:,1);
g=img_noise(:,:,2);
b=img_noise(:,:,3);
r_m=medfilt2(r,[3,3]);
g_m=medfilt2(g,[3,3]);
b_m=medfilt2(b,[3,3]);
img_m=cat(3,r_m,g_m,b_m);
%rgb自編中值濾波函數濾波
r_mz=median_filter(r,[3,3]);
g_mz=median_filter(g,[3,3]);
b_mz=median_filter(b,[3,3]);
img_mz=cat(3,uint8(r_mz),uint8(g_mz),uint8(b_mz));
figure,subplot 131,imshow(img,[]);
subplot 132,imshow(img_noise,[]);
subplot 133,imshow(img_m,[]),title('rgb濾波')%只對rgb通道濾波
function hsi = rgb2hsi(rgb)
% hsi = rgb2hsi(rgb)把一幅RGB圖像轉換爲HSI圖像,
% 輸入圖像是一個彩色像素的M×N×3的數組,
% 其中每一個彩色像素都在特定空間位置的彩色圖像中對應紅、綠、藍三個分量。
% 假如所有的RGB分量是均衡的,那麼HSI轉換就是未定義的。
% 輸入圖像可能是double(取值範圍是[0, 1]),uint8或 uint16。
%
% 輸出HSI圖像是double,
% 其中hsi(:, :, 1)是色度分量,它的範圍是除以2*pi後的[0, 1];
% hsi(:, :, 2)是飽和度分量,範圍是[0, 1];
% hsi(:, :, 3)是亮度分量,範圍是[0, 1]。

% 抽取圖像分量
rgb = im2double(rgb);
r = rgb(:, :, 1);
g = rgb(:, :, 2);
b = rgb(:, :, 3);

% 執行轉換方程
% 實現H分量
num = 0.5*((r - g) + (r - b));
den = sqrt((r - g).^2 + (r - b).*(g - b));
% 防止除數爲0
theta = acos(num./(den + eps)); 

H = theta;
H(b > g) = 2*pi - H(b > g);
H = H/(2*pi);
% 實現S分量 
num = min(min(r, g), b);
den = r + g + b;
% 防止除數爲0
den(den == 0) = eps; 
S = 1 - 3.* num./den;

H(S == 0) = 0;

%實現I分量
I = (r + g + b)/3;

% 將3個分量聯合成爲一個HSI圖像
hsi = cat(3, H, S, I);
%hsi = H;    %分別返回3個分量
%hsi = S;
%hsi = I;
function rgb = hsi2rgb(HSI) 
% 將圖像從HSI空間轉換到RGB空間 
% 輸入參數爲hsi圖像,輸出變量爲rgb 

% 分別取出H、S、I分量 
H=HSI(:,:,1)*2*pi; 
S=HSI(:,:,2); 
I=HSI(:,:,3);

% 定義R、G、B三個矩陣大小 
R=zeros(size(H));%size(H)求矩陣H的行列數,返回2個向量,第一個是行數,第二是列數 
G=zeros(size(H)); 
B=zeros(size(H));

% H在[0,120°)區間 
sy=find((0<=H)&(H<2*pi/3)); 
B(sy)=I(sy).*(1-S(sy)); 
R(sy)=I(sy).*(1+S(sy).*cos(H(sy))./cos(pi/3-H(sy))); 
G(sy)=3*I(sy)-(R(sy)+B(sy));

% H在[120°,240°)區間 
sy=find((2*pi/3<=H)&(H<4*pi/3)); 
R(sy)=I(sy).*(1-S(sy)); 
G(sy)=I(sy).*(1+S(sy).*cos(H(sy)-2*pi/3)./cos(pi-H(sy))); 
B(sy)=3*I(sy)-(R(sy)+G(sy));

% H在[240°,360°)區間 
sy=find((4*pi/3<=H)&(H<2*pi)); 
G(sy)=I(sy).*(1-S(sy)); 
B(sy)=I(sy).*(1+S(sy).*cos(H(sy)-4*pi/3)./cos(5*pi/3-H(sy))); 
R(sy)=3*I(sy)-(G(sy)+B(sy));

%級聯,獲取RGB影像 
rgb=cat(3,R,G,B);

end
function [ img ] = median_filter( image, m )
%----------------------------------------------
%中值濾波
%輸入:
%image:原圖
%m:模板的大小3*3的模板,m=3

%輸出:
%img:中值濾波處理後的圖像
%----------------------------------------------
    n = m;
    [ height, width ] = size(image);
    x1 = double(image);
    x2 = x1;
    for i = 1: height-n+1
        for j = 1:width-n+1
            mb = x1( i:(i+n-1),  j:(j+n-1) );
            mb = mb(:);
            mm = median(mb);
            x2( i+(n-1)/2,  j+(n-1)/2 ) = mm;

        end
    end
  % img=uint8(x2);
    img = double(x2);


end

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章