本文主要通過線性過濾器原理對圖像進行過濾,并根據自定義的過濾器截取不同圖像的高低頻率進行混合,達到不同距離産生不同解釋的效果。使用工具是MATLAB。本文主要包括以下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;
圖像過濾中間結果
二.圖像混合(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 ;
圖像混合中間結果
三.結論分析
1.網上找的圖像,絕大部分是不對齊的,而且大小不同,無法進行直接混合。需先做對齊(比如人物類圖像可以鼻子為中心),然後調整為相同大小,再做混合。
2.截斷頻率并不是一成不變的,根據不同的圖像選擇不同的截斷頻率,以達到最好的混合效果,proj1代碼裡每組例子後面注釋有我使用的截斷頻率