SeamCarving相关介绍及MATLAB实现

SeamCarving是一种智能图像缩放技术,它能保持图像重要部分不变形。该技术通过删除或添加能量最小的像素行或列。本文介绍了计算能量图和能量累加图的过程,并提供了MATLAB代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SeamCarving是一款图像智能缩放的技术,他能在改变图像大小的同时,不影响图像的重要内容。

由于是小组合作,这里就只发布我做的第一部分,裁剪线的删除和增加部分,以及GUI部分不做叙述.

 如上,在这张图中,明显重要的内容就是飞鸟,而背景则不重要。传统的缩放技术,一是等比例缩放,如果纵向和横线缩放的比例不一致,就会导致图像严重变形;二是裁剪,那就会把边缘的飞鸟也裁剪掉。

示范图例如下:




从以上的对比图中可以看出seamcarving可以较好的保存图像的重要部分,并看起来不那么畸形。那么我们如何来实现呢?

1.计算能量图

 首先我们要知道,seamcarving是通过删除或插入水平或垂直的裁剪线来达到智能缩放的目的,这个裁剪线就是图像能量最小的通道。那么我们就要先得到图像的能量图再来根据能量图得到裁剪线。而能量图是由梯度图计算得来。图像某处的变化越大那么相应的梯度以及能量也就越大。

可由sobel算子与图像三个通道相乘来得到它的梯度能量图.

2.计算能量累加图

    能量累加图的由以下公式获得:

  M(i,j) =e(i,j)+min(M(i−1,j−1),M(i−1,j),M(i−1,j+1))
 (此公式摘自论文 Seam Carving for Content-Aware Image Resizing)
    在这里我们可以看到利用动态规划可以找到最优的裁剪线。第一步是将图像从第二行遍历到最后一行。计算累积最小能量。M(i,j)为该点的累积能量值,e(i,j)为该点由第一步计算得出的能量值.
3.寻找最小裁剪线
    由于能量累积图中我们是由前往后累加计算,第一行并未得到累加,那么找纵向裁剪线时,则应该从最后一行往前寻找裁剪线的点.
    找到最后一行能量最小的点,再根据坐标找前一行与之相邻的点中能量最小的点,如此递归,当贯穿了整个图像后,即得到了裁剪线.可将已经找到的裁剪线的坐标点做个标记,以防2次找线时有重叠,导致每行像素点不齐.
    而纵向裁剪线则可将图片转置,并重新计算能量累加图,同上找最佳的裁剪线,并记录坐标.
    若是缩小图片,可直接将找出的裁剪线删除,若是放大图片,以防只在同一个位置插入无用的像素,导致图像的重心偏移,可以在多条裁剪线(从小到大)的一个方向插入与裁剪线相同或相邻的像素点.

4.代码实现
.)))

function seam(pic,n,n2)%pic是要裁剪的图片,n是纵向裁剪线的条数,n2是横向裁剪线的条数

%UNTITLED 此处显示有关此函数的摘要

%  seam carving赵若妃组:谢沛蓉第一部分

%pic=imread('timg2.jpg');

%n=1;

%n2=2;

%将图像分RGB三个通道做处理

%pic=imread('timg2.jpg');

picR = pic(:,:,1); 

picG = pic(:,:,2); 

picB = pic(:,:,3); 

%将图像内容变成可做运算的值

picRI=double(picR);

picGI=double(picG);

picBI=double(picB);

%原图像的宽和高

[H,W]=size(picRI);

%求R,G,B三个通道上的梯度图

after_picr=zeros(H,W);

after_picg=zeros(H,W);

after_picb=zeros(H,W);

gradient=zeros(H,W);

%定义sobel算子

sobelx=[-1,-2,-1;0,0,0;1,2,1;];

sobely=[-1,0,1;-2,0,2;-1,0,1;];

%将sobel算子与原图的三个通道图的子模块分别做点乘,得到三个通道的梯度图

for i=2:H-1

   for j=2:W-1

       subR=picRI(i-1:i+1,j-1:j+1);

       tempR1=subR.*sobelx;

       tempR2=subR.*sobely;

       x1=sum(sum(tempR1));<

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值