当前位置: 代码迷 >> 综合 >> CS143-project1 图像过滤与图像混合Image Filtering and Hybrid Images
  详细解决方案

CS143-project1 图像过滤与图像混合Image Filtering and Hybrid Images

热度:97   发布时间:2023-12-06 18:48:56.0

 

本文主要通过线性过滤器原理对图像进行过滤,并根据自定义的过滤器截取不同图像的高低频率进行混合,达到不同距离产生不同解释的效果。使用工具是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;

图像过滤中间结果

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

 

  相关解决方案