天天看點

CS143-project1 圖像過濾與圖像混合Image Filtering and Hybrid Images

本文主要通過線性過濾器原理對圖像進行過濾,并根據自定義的過濾器截取不同圖像的高低頻率進行混合,達到不同距離産生不同解釋的效果。使用工具是MATLAB。本文主要包括以下3部分内容:

  1. 圖像過濾.
  2. 圖像混合.
  3. 結論分析

一.圖像過濾(MY_IMFILTER)

此算法有兩個參數,分别是圖像資料image 和 濾波器filter。實際上是兩個矩陣。算法核心就是把濾波器看做一個盒子,通過滑動濾波器,使盒子中心位于image的像素上,并計算相鄰像素和濾波器的權重和,依次得出全部的像素值。本算法特點:

1.支援彩色圖像

2.支援任意次元的過濾器

3.邊界補0

4.傳回圖像與輸入圖像分辨率相同

matlab腳本:

function output = my_imfilter(image, filter)

g = size(filter); %g(1)行數,g(2)列數

temp_matrix(1:g(1),1:g(2)) = 1; %定義計算塊,次元和過濾器相同,用于臨時存儲平移時計算出的像素值

[height,width,num_colors] = size(image);

return_image(1:height,1:width,1:num_colors) = 1;%設定傳回的image,初始元素值均為1

%支援任意形狀的過濾器,隻要各維的長度是奇數

if mod(g(1),2)==0 || mod(g(2),2)==0

'過濾器各維長度必須是奇數'

return;

end;

%原圖像邊界補0操作(根據過濾器的維數計算得出)

add_rows = (g(1)-1)/2;

add_cols = (g(2)-1)/2;

zero_rows = zeros(add_rows,width,num_colors);

zero_cols = zeros(g(1) - 1+ height,add_cols,num_colors);

full_image = cat(1,zero_rows,image,zero_rows);

full_image = cat(2,zero_cols,full_image,zero_cols);

%抽取3個分量的圖像(RGB) 支援彩色圖像

image_R = full_image(:,:,1);

image_G = full_image(:,:,2);

image_B = full_image(:,:,3);

result_R(1:height,1:width) = 1;

result_G(1:height,1:width) = 1;

result_B(1:height,1:width) = 1;

%分别對3個分量的圖像進行過濾(權重平均求和)

for i = 1:height

for j = 1:width

temp_matrix = image_R(i:i+g(1)-1,j:j+g(2)-1).*filter; %将中心相鄰的塊像素值和過濾器對應值相乘,存放在temp_matrix

temp_sum = sum(sum(temp_matrix)); %各相鄰塊相乘後的結果求和

result_R(i,j) = temp_sum;

end;

end;

for i = 1:height

for j = 1:width

temp_matrix = image_G(i:i+g(1)-1,j:j+g(2)-1).*filter; %将中心相鄰的塊像素值和過濾器對應值相乘,存放在temp_matrix

temp_sum = sum(sum(temp_matrix)); %各相鄰塊相乘後的結果求和

result_G(i,j) = temp_sum;

end;

end;

for i = 1:height

for j = 1:width

temp_matrix = image_B(i:i+g(1)-1,j:j+g(2)-1).*filter; %将中心相鄰的塊像素值和過濾器對應值相乘,存放在temp_matrix

temp_sum = sum(sum(temp_matrix)); %各相鄰塊相乘後的結果求和

result_B(i,j) = temp_sum;

end;

end;

%将3個分量的圖像重新拼湊起來

return_image = cat(3,result_R,result_G,result_B);

output =return_image;

圖像過濾中間結果

CS143-project1 圖像過濾與圖像混合Image Filtering and Hybrid Images
CS143-project1 圖像過濾與圖像混合Image Filtering and Hybrid Images

二.圖像混合(Proj1)

此算法設了兩個截斷頻率:cutoff_frequency1和cutoff_frequency2。用來分别控制兩幅圖像的高頻信号強度,以達到更好的混合效果。

matlab腳本如下:

%賓利夏利

image1 = im2single(imread('../html/Bentley.jpg'));

image2 = im2single(imread('../html/xiali.jpg'));

%% Filtering and Hybrid Image construction

cutoff_frequency1 = 5; %剔除的高頻信号強度

cutoff_frequency2 = 5; %保留的高頻信号強度

filter1 = fspecial('Gaussian', cutoff_frequency1*4+1, cutoff_frequency1);

filter2 = fspecial('Gaussian', cutoff_frequency2*4+1, cutoff_frequency2);

low_frequencies = my_imfilter(image1,filter1);

high_frequencies = image2 - my_imfilter(image2,filter2);

hybrid_image = low_frequencies + high_frequencies ;

 

 

圖像混合中間結果

CS143-project1 圖像過濾與圖像混合Image Filtering and Hybrid Images
CS143-project1 圖像過濾與圖像混合Image Filtering and Hybrid Images

三.結論分析

1.網上找的圖像,絕大部分是不對齊的,而且大小不同,無法進行直接混合。需先做對齊(比如人物類圖像可以鼻子為中心),然後調整為相同大小,再做混合。

2.截斷頻率并不是一成不變的,根據不同的圖像選擇不同的截斷頻率,以達到最好的混合效果,proj1代碼裡每組例子後面注釋有我使用的截斷頻率

繼續閱讀