[CV] 图像梯度

图像梯度

1.图像的表达#

这里我们讨论2D图像,一般图像的存储格式是一个二维矩阵,每个位置对应图像的像素值,用数学描述

z=I(x,y)

x,y 代表图像坐标(某个点的坐标),z 代表此点的像素值(强度值),所以图像可以看作一个二元的函数(离散的),将图像在三维坐标中画出来,如下图所示,强度值的高低代表了曲面的高低。

http://www.cse.psu.edu/~rtc12/CSE486/lecture02.pdf

2. 图像的梯度#

既然可以将图像看作是一个二元函数,那么自然想到考虑二元函数的梯度(一元函数是导数),因为图像是离散的,所以和一般的连续函数还有些不同。离散的话,就要考虑数值方法求梯度。

2.1 数值微分#

根据泰勒级数展开式

f(x+h)=f(x)+hf(x)+12h2f(x)+13!h3f(x)+O(h4)

f(x+h)f(x)=hf(x)+12h2f(x)+O(h3)

f(x+h)f(x)h=f(x)+O(h)

这就是有限向前差分,在图像中,例如在x方向,对应的值就是f(x+1,y)f(x,y)

根据泰勒级数展开式

f(xh)=f(x)hf(x)+12h2f(x)13!h3f(x)+O(h4)

f(x)f(xh)=hf(x)12h2f(x)+O(h3)

f(x)f(xh)h=f(x)+O(h)

这就是有限向后差分,在图像中,例如在x方向,对应的值就是f(x,y)f(x1,y)

根据泰勒级数展开式

f(x+h)f(xh)=f(x)+hf(x)+12h2f(x)+13!h3f(x)+O(h4){f(x)hf(x)+12h2f(x)13!h3f(x)+O(h4)}=2hf(x)+23!h3f(x)+O(h4)

f(x+h)f(xh)2h=f(x)+O(h2)

这就是有限中心差分,在图像中,例如在x方向,对应的值就是f(x+1,y)f(x1,y),因为展开式后面跟的是h的2阶无穷小,所以中心差分比向前、向后都要准确。

2.2 图像中的梯度#

  • 向前,f(x+h)f(x)h,在图像中f(x+1,y)f(x,y)
  • 向后,f(x)f(xh)h,在图像中f(x,y)f(x1,y)
  • 中心,f(x+h)f(xh)2h,在图像中f(x+1,y)f(x1,y)

如下图所示,x方向的梯度图,可以看到水平方向的线条不明显了,只留下了垂直方向的线条,这是因为x方向梯度的数值的大小代表水平方向强度值变换的大小,因为水平的线条可能都是一种强度,所以数值都差不多,所以都消失了,而在垂直方向变化比较大。y方向同理,可以看见水平方向的线条不明显,垂直方向的线条明显。

2.3 Matlab代码#

img = imread('img.jpg');
gray = double(rgb2gray(img));
wsize = size(gray,2);
hsize = size(gray,1);
%Normalize,因为差分可能求出负值,所以做一个归于1化,将数值映射到[0,255]
h = Normalize(gray(:,3:wsize)-gray(:,1:wsize-2));%中心差分
v = Normalize(gray(3:hsize,:)-gray(1:hsize-2,:));%中心差分
hv = Normalize(sqrt(h(3:end,:).^2+v(:,3:end).^2)); %x,y方向合成

subplot(2,2,1);
imshow(uint8(gray));
title('灰度');

subplot(2,2,2);
imshow(uint8(hv));
title('xy方向合成');

subplot(2,2,3);
imshow(uint8(h));
title('x方向梯度');

subplot(2,2,4);
imshow(uint8(v));
title('y方向梯度');
function o = Normalize(img)
f = img(:)'; % 展开矩阵为一列,然后转置为一行。
m = mapminmax(f, 0, 255); % 归一化。
o = reshape(m, size(img)); % 还原为原始矩阵形式。此处不需转置回去,因为reshape恰好是按列重新排序
end

作者:芒果和小猫

出处:https://www.cnblogs.com/WAoyu/p/12401506.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   芒果和小猫  阅读(688)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu