天天看点

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代码里每组例子后面注释有我使用的截断频率

继续阅读