计算机视觉之混合图像(Hybridimages)matlab源码史上最详细注释

更新时间:2023-07-07 06:09:49 阅读: 评论:0

计算机视觉之混合图像(Hybridimages)matlab源码史上最详细注释
1.问题描述
在给定数据集上完成以下⼯作:这项任务的⽬标是参考简化版论⽂(the SIGGRAPH 2006 paper by Oliva, Torralba, and Schyns),编写⼀个图像过滤函数,并使⽤它来创建混合图像。因为混合图像是静态图像,其解释随观察距离的变化⽽变化。基本的想法是当⾼频信号可⽤时,它往往会主导感知,但在远处,只能看到信号的低频(平滑)部分,于是通过将⼀幅图像的⾼频部分与另⼀幅图像的低频部分混合,可以得到⼀幅混合图像,该图像在不同距离处可以产⽣不同的解释。
要混合成下图的效果,近距离看是导弹,远距离是鱼:
2.模型建⽴
2.1.⾼斯低通过滤器
⾼斯滤波对图像邻域内像素进⾏平滑时,邻域内不同位置的像素被赋予不同的权值,对图像进⾏平滑的同时,同时能够更多的保留图像的总体灰度分布特征。 数值图像处理中,⾼斯滤波主要可以使⽤两种⽅法实现。⼀种是离散化窗⼝滑窗卷积,另⼀种⽅法是通过傅⾥叶变化。在这我主要想说说第⼀种⽅法的⾼斯滤波。离散化窗⼝滑窗卷积的时,主要利⽤的是⾼斯核,⾼斯核⼀般是⼀个奇数的⼤⼩的⾼斯模板。
截⽌频率(⾼斯模糊的标准偏差),以像素为单位,当振幅增益gain=1/2时定义的频率,fspecial建⽴⼀个标准差为cutoff_frequency,尺⼨为(cutoff*4+1,1)的滤波模板。
filter =fspecial('Gaussian',[cutoff_frequency*4+11], cutoff_frequency);
其中:类型是⾼斯低通滤波、第⼆项是模板尺⼨(⼀维滤波),第三项是滤波器的标准差,即截⽌频率。婴儿不喝奶粉怎么办
对边界采⽤0填充,将原图像按列排列,⽅便⼀维滤波做乘法,⼀维计算快。
for循环单独过滤每⼀个通道。滤波模板滑到每⼀块的时候计算矩阵即可。可以利⽤matlab内置函数imfilter直接⼀句搞定,不过低频部分特别特别模糊,测试过但结果不太好。为适⽤于彩⾊图像,只需独⽴过滤每个颜⾊通道。该过滤器适⽤于任何⾼度和宽度的组合,只要⾼度、宽度是奇数,那么中⼼像素的位置就是明确的。边界问题:⽤0填充。
padarray是填充函数,[r ,c]为填充尺⼨ 中间像素,⼤⼩为过滤器尺⼨的⼀半;⽆填充⽅法参数 默认⽤零填充;⽆填充⽅向参数 默认both:在每⼀维的第⼀个元素前和最后⼀个元素后填充。
pad_input_image =padarray(intput_image,[(filter_row -1)/2,(filter_col -1)/2]);
for layer =1:size(intput_image,3)
% im2col将输⼊图像的⾏列按列展开,⼀块展开成是53个像素,53*1
%模板滑到的⼀块区域按列存储,⽅便和模板进⾏矩阵计算
columns =im2col(pad_input_image(:,:,layer),[filter_row, filter_col]);
%卷积,滤波模板乘以每⼀列,得到的就是输出图像
filterd_columns = filter’* columns;
智的成语
% col2im是从列恢复到原图像尺⼨
output(:,:,layer)=col2im(filterd_columns,[1,1],[intput_row, intput_col]);
end
2.2 混合图像流程
在本实验中,我们采⽤⾼斯低通过滤的⽅法得到低频部分,通过原图减低频信号部分得到⾼频,进⽽将两张图⽚混合得到结果并输出。具体流程如下图3:
a 输⼊图⽚
b 分配数据:将数据集两两配对,bird与plane、cat与dog、motocycle与bicycle、fish与submarine、marilyn与einstein
c ⼿动选择图像两点进⾏对齐操作
d 设置相关参数
e 计算⾼斯模板
f 将图像进⼊⾼斯低频通道进⾏过滤,得到低频信号部分
g 计算⾼频信号
h 混合两张图像,并将结果输出
3.Matlab源码
%readme
软件版本:Matlab R2014b
proj1.m 是主函数
my_imfilter.m 是过滤函数(⽤的⾼斯低频过滤)
突兀的反义词
vis_hybrid_image.m 是对混合图像下采样,⽅便查看结果
proj1_test_filtering.m 是采⽤了6种过滤⽅法对my_imfilter过滤函数测试,
可以⽐较不同模板过滤出来的效果
alig.m 是图像对齐函数,主函数中调⽤已注释,运⾏需要修改⼀下
data应与code在同⼀路径下并列
直接运⾏proj1.m可得到结果
运⾏proj1_test_filtering.m 可以得到不同⽅法的过滤效果图
主函数proj1.m
clo all;
%%主函数流程:
%1.输⼊图像设置参数建⽴滤波算⼦
%2.对图1低通过滤,对图2⾼通过滤
%3.合成hybrid图⽚,输出结果(第⼀个窗⼝包括原图、低、⾼频图和混合图,第⼆个窗⼝是缩⼩图像尺⼨的图)
%对齐操作
%[image1,image2]=alignment();
%%输⼊图⽚
%imread返回图像类型是uint8,矩阵范围为0--255
%im2single将图⽚转换成单精度数,范围是0--1
image1 =im2single(imread('../data/bicycle.bmp'));
image2 =im2single(imread('../data/motorcycle.bmp'));
%% Filtering and Hybrid Image construction
%截⽌频率(⾼斯模糊的标准偏差),以像素为单位,当振幅增益gain=1/2时定义的频率
cutoff_frequency =13;
%fspecial建⽴⼀个标准差为cutoff_frequency,尺⼨为(cutoff*4+1,1)的滤波模板;
%原理公式可见:/bingdaocaihong/p/7007346.html
%fspecial函数c语⾔实现:blog.csdn/xizero00/article/details/8595781
%其中:类型是⾼斯低通滤波、第⼆项是模板尺⼨(⼀维滤波),第三项是滤波器的标准差,即截⽌频率filter =fspecial('Gaussian',[cutoff_frequency*4+11], cutoff_frequency);
%对image1进⾏低通过滤,得到图1的低频部分
%low_frequencies=imfilter(image1, filter);
%卷积算⼦是对称矩阵,将其分解成⼀个矩阵与其转置的乘积
%先后与原图进⾏卷积,减少计算次数
low_frequencies =my_imfilter(my_imfilter(image1, filter), filter');
%得到图2的⾼频部分。对image2进⾏低通过滤,得到图2的低频部分,⽤image2减低频即为⾼频部分
%high_frequencies= image2-imfilter(image2, filter);
high_frequencies = image2 -my_imfilter(my_imfilter(image2, filter), filter');
%hybrid image(图1的低频+图2的⾼频)
hybrid_image = low_frequencies + high_frequencies;
%%保存和输出结果
subplot(2,3,1)
imshow(image1);
title('image1');
%输出图1的低频部分
subplot(2,3,2)
imshow(low_frequencies);
title('low frequencies');
subplot(2,3,4)
imshow(image2);
title('image2');
%输出图2的低频部分
%imshow的数据范围是0--1
%high_frequencies+0.5的原因:
%原图四周较⿊,⾼通过滤后,四周提取到的特征会很少,显⽰会很⿊,影响观察结果
%加上0.5后便于观察(加合适的值也可以)
subplot(2,3,5)
imshow(high_frequencies+0.5);
咖喱土豆泥
title('high frequencies');
%显⽰混合图⽚
subplot(2,3,[36])
imshow(hybrid_image);
title('hybrid image');
%缩⼩显⽰混合图⽚,⽅便⽐对结果
vis =vis_hybrid_image(hybrid_image);
figure(2);imshow(vis);
title('hybrid image downsampling:');
%在当前⽬录保存结果为jpg⽂件
imwrite(low_frequencies,'low_frequencies.jpg','quality',95);
imwrite(high_frequencies +0.5,'high_frequencies.jpg','quality',95);
imwrite(hybrid_image,'hybrid_image.jpg','quality',95);
imwrite(vis,'hybrid_image_scales.jpg','quality',95);
滤波函数my_imfilter.m
function output =my_imfilter(image, filter)
%%过滤函数思路世说新语读后感
%对边界采⽤0填充,将原图像按列排列,⽅便⼀维滤波做乘法,⼀维计算快
%for循环单独过滤每⼀个通道
%滤波模板滑到每⼀块的时候计算矩阵即可
%%可以利⽤matlab内置函数imfilter直接⼀句搞定,不过低频部分特别特别模糊,结果不太好
%output =imfilter(image, filter);
%为适⽤于彩⾊图像,只需独⽴过滤每个颜⾊通道。
%该过滤器适⽤于任何⾼度和宽度的组合,只要⾼度、宽度是奇数,那么中⼼像素的位置就是明确的。
%边界问题:⽤0填充
%%
intput_image = image;
%输⼊图⽚的⾏和列331*375
[intput_row, intput_col]=size(intput_image(:,:,1));
%过滤模板的⾏和列53*1
[filter_row, filter_col]=size(filter);
%padarray是填充函数,[r ,c]为填充尺⼨中间像素,⼤⼩为过滤器尺⼨的⼀半
%⽆填充⽅法参数默认⽤零填充;⽆填充⽅向参数默认both:在每⼀维的第⼀个元素前和最后⼀个元素后填充pad_input_image =padarray(intput_image,[(filter_row -1)/2,(filter_col -1)/2]);
output =[];
for layer =1:size(intput_image,3)%独⽴过滤每⼀层通道
% im2col将输⼊图像的⾏列按列展开,⼀块展开成是53个像素,53*1
%模板滑到的⼀块区域按列存储,⽅便和模板进⾏矩阵计算
columns =im2col(pad_input_image(:,:,layer),[filter_row, filter_col]);
% transpo是转置函数
filter2 =transpo(filter(:));
%矩阵乘法,滤波模板乘以每⼀列,得到的就是输出图像
filterd_columns = filter2 * columns;
% col2im是从列恢复到原图像尺⼨
output(:,:,layer)=col2im(filterd_columns,[1,1],[intput_row, intput_col]);
end
显⽰混合结果函数vis_hybrid_image.m
function output =vis_hybrid_image(hybrid_image)
%%成倍缩⼩4次混合图像,最后的结果output是⼀张图,⽅便从不同距离观察结果,⽩⾊区域是⽤零填充的
%对混合图像进⾏下采样
%下采样⼜称缩⼩图像
scales =5;%缩⼩4次
scale_factor =0.5;%每次缩⼩2倍
padding =5;%填充5个像素⽤于图⽚间隔
original_height =size(hybrid_image,1);%图像的⾏数
num_colors =size(hybrid_image,3);%图像的通道数
output = hybrid_image;
cur_image = hybrid_image;
for i =2:scales  %缩⼩4次
%填充5列像素,2指按⾏合并两个矩阵
%填充的像素值是1(⽩⾊)
output =cat(2, output,ones(original_height, padding, num_colors));
%imresize命令是下采样操作。将cur_image缩⼩1/scale_factor倍,bilinear采⽤双线性插值法
%双线性插值法:/snow826520/p/9267837.html
cur_image =imresize(cur_image, scale_factor,'bilinear');
%1指按列合并两个矩阵,上⾯是⽩⾊,下⾯是缩⼩后的图
严丝合缝的意思
tmp =cat(1,ones(original_height -size(cur_image,1),size(cur_image,2), num_colors), cur_image);
%将前⼀output和此时缩⼩图tmp按⾏合并
output =cat(2, output, tmp);
建材导购end
⽐较6种不同的滤波proj1_test_filtering.m
%%对⾃⼰写的my_imfilter进⾏过滤测试(6种不同⽅法)
%1、⾃定义[000;010;000]
%2、box filter[111;111;111]像是均值滤波
%3、低通滤波器(⾼斯模糊)
%4、定向滤波器(Sobel算⼦)⼀种⾼通
%5、⾼通滤波器(离散拉普拉斯Laplacian)
%6、简单的⾼通滤波(直接原图减去⾼斯模糊的低频部分)
clo all
picture_name ='bird';
picture_format ='.bmp';
%% Setup
test_image =im2single(imread(strcat('../data/', picture_name, picture_format)));%读图
%缩⼩原图尺⼨输出
figure(1)
办法的拼音
imshow(test_image)
title('original image');
%% Identify filter
%This filter no change
identity_filter =[000;010;000];
identity_image  =my_imfilter(test_image, identity_filter);
figure(2);imshow(identity_image);
title('center=1');
mkdir(strcat('../data/', picture_name));
imwrite(identity_image,strcat('../data/', picture_name,'/identity_image.jpg'),'quality',95);
%% Small blur with
%This box filter 除去⼀些⾼频部分
blur_filter =[111;111;111];
blur_filter = blur_filter /sum(sum(blur_filter));%making the filter sum to 1
blur_image =my_imfilter(test_image, blur_filter);

本文发布于:2023-07-07 06:09:49,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1083143.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   混合   填充   函数   滤波   模板
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图