图像的梯度

转载:
图像梯度的基本原理
OpenCV图像处理(十一)—图像梯度

图像模糊

    图像模糊是因为图像中的轮廓不明显轮廓边缘灰度变化不强烈层次感不强造成的。
   那么反过来考虑。轮廓边缘灰度变化明显些,层次感强烈些,是不是图像就更清晰些呢。

图像梯度

    图像梯度简单来说就是秋冬,在图像上表现出来的就是提取图像边缘(横向、纵向扥等)。

1.1 数学推导

    首先来看一下传统微积分里面的求导公式(对x的一阶微分):
在这里插入图片描述
而图像是一个二期函数f(x,y),其微分当然是偏微分。因此有:
在这里插入图片描述
ϵ这个值如何选取呢?上高数的时候,都是连续函数,这个值可以取得很小,ϵ可以理解为x的最小前进步伐,但是图像是一个离散的二维函数,ϵ不能取得很小,图像中像素来离散的,而像素之间最小的距离是1,ϵ取为1,所以,上面的公式变为:
在这里插入图片描述
由此,我们得到了图像在x方向和y方向的梯度公式了。值得注意的是,如果我们仔细观察公式就可发现,所谓x方向和y方向的梯度公式不就是相邻连个像素值之间的差值吗?是的,你没看错,当然,我们很多时候都会将两个方向的梯度进行合成:
在这里插入图片描述
这里又是平方,又是开方的,计算量比较大,于是一般用绝对值来近似平方和平方根的操作,来降低计算量:
在这里插入图片描述
(x,y)处的梯度方向:
在这里插入图片描述

示例:
#coding:utf-8
import cv2 
import numpy as np
 
# Scharr算子实现梯度计算
def Scharr_demo(image):
    # x 方向梯度
    image_grad_x = cv2.Scharr(image, cv2.CV_32F, 1, 0)
    # y 方向梯度
    image_grad_y = cv2.Scharr(image, cv2.CV_32F, 0, 1)
    # 分别求绝对值并转化为8位的图像上,这样做方便显示
    image_gradx = cv2.convertScaleAbs(image_grad_x) 
    image_grady = cv2.convertScaleAbs(image_grad_y)
    # 显示两个方向图像
    cv2.imshow("image_gradient-x", image_gradx)
    cv2.imshow("image_gradient-y", image_grady)
 
 
    #两个方向梯度的叠加,权重各自一半
    image_gradxy = cv2.addWeighted(image_gradx, 0.5, image_grady, 0.5, 0)
    cv2.imshow("image_gradient", image_gradxy) 
 
if __name__ == '__main__':
    image = cv2.imread("./test01.jpg")
    cv2.imshow("src_image", image)
    Scharr_demo(image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  • X 方向梯度
    在这里插入图片描述
  • y 方向梯度图像:
    在这里插入图片描述
  • X,Y方向叠加
    在这里插入图片描述

总结:

图像梯度的本质:当前方向上相邻像素的差值。

利用梯度(灰度值的变化率)增强图像的清晰度

我们先考虑下x方向,选取某个像素,假设其像素值是100,沿x方向的相邻像素分别是90,90,90,则根据上面的计算其x方向梯度分别是10,0,0。这里只取变化率的绝对值,表明变化的大小即可。
在这里插入图片描述
我们看到,100和90之间亮度相差10,并不是很明显,与一大群90的连续灰度值在一起,轮廓必然是模糊的。我们注意到,如果相邻像素灰度值有变化,那么梯度就有值,如果相邻像素灰度值没有变化,那么梯度就为0。如果我们把梯度值与对应的像素相加,那么灰度值没有变化的,像素值不变,而有梯度值的,灰度值变大了。
在这里插入图片描述

示例:
import cv2
import numpy as np

moon = cv2.imread("moon.tif", 0)
row, column = moon.shape
moon_f = np.copy(moon)
moon_f = moon_f.astype("float")

gradient = np.zeros((row, column))

for x in range(row - 1):
    for y in range(column - 1):
        gx = abs(moon_f[x + 1, y] - moon_f[x, y])
        gy = abs(moon_f[x, y + 1] - moon_f[x, y])
        gradient[x, y] = gx + gy

sharp = moon_f + gradient
sharp = np.where(sharp < 0, 0, np.where(sharp > 255, 255, sharp))

gradient = gradient.astype("uint8")
sharp = sharp.astype("uint8")
cv2.imshow("moon", moon)
cv2.imshow("gradient", gradient)
cv2.imshow("sharp", sharp)
cv2.waitKey()

在这里插入图片描述

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值