使用一阶微分处理图像——梯度

使用一阶微分处理图像——梯度

函数f(x,y)梯度的定义

使用一阶微分处理图像——梯度_第1张图片
几何特性是 f 在位置(x, y)处最大变化率的方向。其幅值表示为M(x, y)。M(x,y)也是图像,里面的值是梯度,通常称为梯度图像
在这里插入图片描述
梯度向量的分量是微分,所以它们是微分算子。但向量的幅度不是,因为做了平方和平方根操作。另一方面偏微分不是旋转不变的(各向同性),而梯度向量的幅度是旋转不变的。在某些实现中,用绝对值来近似平方和平方根更适合计算。
在这里插入图片描述

一维函数f(x)的一阶微分差分形式:

在这里插入图片描述

罗伯特交叉梯度算子

使用一阶微分处理图像——梯度_第2张图片
使用一阶微分处理图像——梯度_第3张图片
偶数模板不好实现,改进为3*3
使用一阶微分处理图像——梯度_第4张图片
使用一阶微分处理图像——梯度_第5张图片

代码

import numpy as np
from PIL import Image
import cv2

imgfile = "circle.PNG"
OriginalPic = np.array(Image.open(imgfile).convert('L'), dtype=np.uint8)
img = np.zeros((OriginalPic.shape[0]+2, OriginalPic.shape[1]+2), np.uint8)

#########  制造遍历图像  ###################
for i in range(1, img.shape[0]-1):
    for j in range(1, img.shape[1]-1):
        img[i][j] = OriginalPic[i-1][j-1]

Roberts = np.zeros((OriginalPic.shape[0], OriginalPic.shape[1]), dtype=np.uint8)
kernel_x = [[-1, -2, -1], [0, 0, 0], [1, 2, 1]]
kernel_y = [[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]
for i in range(0, Roberts.shape[0]):
    for j in range(0, Roberts.shape[1]):
        Roberts[i][j] = np.sum(np.abs(np.multiply(kernel_x, img[i:i+3, j:j+3])) + np.abs(np.multiply(kernel_y, img[i:i+3, j:j+3])))

cv2.imshow("Original", OriginalPic)
cv2.imshow("Roberts", Roberts)
cv2.waitKey(0)

效果图

使用一阶微分处理图像——梯度_第6张图片

你可能感兴趣的:(笔记,计算机视觉,python)