数字图像处理-7-图像的梯度锐化算法
文章目录
- 1. 门限梯度锐化
- 2. 梯度二值化
- 3. 固定值梯度锐化
图像梯度是灰度值在空间上的变化速率。平滑区域梯度小(灰度均匀),边缘区域梯度大(灰度急变)。
其实这种方法在前面也说过,计算公式如下: 一阶差分近似
G(x, y) = sqrt( (f(x,y) - f(x-1,y))² + (f(x,y) - f(x,y-1))² )
梯度锐化根据梯度大小采取三种不同的增强策略:
- 门限锐化 — 梯度大则增加固定亮度 +100(可动态调整),边缘变亮但保留纹理
- 二值化 — 根据梯度输出纯黑/白二值图,清晰显示边缘轮廓
- 固定锐化 — 梯度大则强制输出白色,否则保留原灰度值
下面是一阶差分近似梯度的python代码,在下面三种方法中都会用到, 原理简单.就是计算上下,左右 的梯度值, 然后求各个维度差分平方的和.
这里说明下下面代码片段中默认阈值(GRADIENT_THRESHOLD=30)
def_compute_gradient(img,x,y):""" 计算像素 (x, y) 的梯度幅度(使用左邻和上邻的一阶差分)。 公式: G = sqrt( dx² + dy² ) dx = f(x, y) - f(x-1, y) dy = f(x, y) - f(x, y-1) """curr=img.get_pixel(x,y)left=img.get_pixel(x-1,y)up=img.get_pixel(x,y-1)dx=curr-left dy=curr-upreturnmath.sqrt(dx*dx+dy*dy)1. 门限梯度锐化
原理:
对边缘区域(梯度≥阈值)叠加固定亮度 100(默认),使边缘在视觉上更突出;
平坦区域保持原值,不破坏背景纹理细节。处理方法:
设置阈值threhold, 如果超过了阈值,则在当前灰度值上面叠加指定的灰度值,让图像边缘更突出G >= threshold → output = min(G + 100, 255) [边缘增亮] G < threshold → output = 原始像素值 [平坦区域不变]python代码
defthreshold_enhance(img,threshold=GRADIENT_THRESHOLD):result=img.clone()foryinrange(1,img.height):forxinrange(1,img.width):g=_compute_gradient(img,x,y)ifg>=threshold:result.set_pixel(x,y,min(255,g+100))# g < threshold 时 clone 的原值保持不变returnresult- 效果图
2. 梯度二值化
原理:
对梯度图像进行全局阈值分割,输出纯黑白二值图。结果图像清晰地勾勒出边缘轮廓,常用于后续形态学处理。处理方法:
这其实就是二值化的处理过程G > threshold → output = 255 (白色,边缘) G <= threshold → output = 0 (黑色,非边缘)python代码
defbinary_threshold(img,threshold=GRADIENT_THRESHOLD):result=Image(img.width,img.height)# 默认全黑foryinrange(1,img.height):forxinrange(1,img.width):g=_compute_gradient(img,x,y)result.set_pixel(x,y,255ifg>thresholdelse0)returnresult- 效果图
3. 固定值梯度锐化
- 原理:
介于门限增强和二值化之间:
边缘被强制置为最大亮度(255),突出轮廓;
非边缘区域保留原始灰度,保持背景信息可读。 - 处理方法:
G > threshold → output = 255 [边缘高亮为白色]
G <= threshold → output = 原始像素值 [非边缘保留原灰度]
deffixed_enhance(img,threshold=GRADIENT_THRESHOLD):result=img.clone()foryinrange(1,img.height):forxinrange(1,img.width):g=_compute_gradient(img,x,y)ifg>threshold:result.set_pixel(x,y,255)# g <= threshold 时保持 clone 的原值returnresult- 效果图
