IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> Opencv之边缘检测卷积算子(roberts与prewitt) -> 正文阅读

[人工智能]Opencv之边缘检测卷积算子(roberts与prewitt)

学习资料参考:

张平.《OpenCV算法精解:基于Python与C++》.[Z].北京.电子工业出版社.2017.


Roberts算子

原理

使用Roberts进行边缘检测,也就是使用以下两个卷积核与图像进行分别卷积。(图中阴影部分数值为锚点所在)
在这里插入图片描述
注意在实际讨论中一般将相近两点的函数值差值作为斜率。如
在这里插入图片描述
那么上述的两个卷积核也就好理解了。类似于
f(x,y) - f(x + 1,y + 1)f(x,y) - f(x - 1,y + 1)两个函数差值。

在边缘我们知道,边缘处的像素差值较大,斜率较大。那么下列给出四种衡量标准:
在这里插入图片描述

程序实现
import numpy as np
import cv2
from scipy import signal


def roberts(I, _boundary='fill', _fillvalue=0):
    # 图像的高和宽
    H1, W1 = I.shape
    # 卷积核的大小
    H2, W2 = 2, 2
    # 卷积核1以及锚点位置
    R1 = np.array([[1, 0], [0, -1]], np.float32)
    kr1, kc1 = 0, 0
    # 计算full卷积
    IconR1 = signal.convolve2d(I, R1, mode='full', boundary=_boundary, fillvalue=_fillvalue)
    IconR1 = IconR1[H2 - kr1 - 1:H1 + H2 - kr1 - 1, W2 - kc1 - 1:W1 + W2 - kc1 - 1]
    # 卷积核2
    R2 = np.array([[0, 1], [-1, 0]], np.float32)
    # 先计算full卷积
    IconR2 = signal.convolve2d(I, R2, mode='full', boundary=_boundary, fillvalue=_fillvalue)
    # 锚点的位置
    kr2, kc2 = 0, 1
    # 根据锚点的位置截取full卷积,从而得到same卷积
    IconR2 = IconR2[H2 - kr2 - 1:H1 + H2 - kr2 - 1, W2 - kc2 - 1:W1 + W2 - kc2 - 1]
    return IconR1, IconR2


if __name__ == "__main__":
    image = cv2.imread(r"C:\Users\1\Pictures\test.jpg", 0)
    cv2.imshow("imgae", image)
    # 卷积,边界扩充采用symm
    IconR1, IconR2 = roberts(image, 'symm')
    # 45度方向上的边缘强度的灰度级显示
    IconR1 = np.abs(IconR1)
    edge_45 = IconR1.astype(np.uint8)
    cv2.imshow("edge_45", edge_45)
    # 135度方向上的边缘强度
    IconR2 = np.abs(IconR2)
    edge_135 = IconR2.astype(np.uint8)
    cv2.imshow("edge_135", edge_135)
    # 用平方和的开方来衡量最后输出的边缘
    edge = np.sqrt(np.power(IconR1, 2.0) + np.power(IconR2, 2.0))
    edge = np.round(edge)
    edge[edge > 255] = 255
    edge = edge.astype(np.uint8)
    # 显示边缘
    cv2.imshow("edge", edge)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果
在这里插入图片描述
综合分析输出图片可知,在edge45edge135上,轮廓较明显分别在45度方向与135度方向,而edge是两者的综合。


Prewitt算子

原理

与Roberts算子类似,prewitt算子也是两个卷积核。(并且其中带阴影部分的数字是锚点所在)
在这里插入图片描述
并且发现上述两个矩阵是可以进行分离的,如下所示
在这里插入图片描述
根据分离的结果可知, p r e w i t t x prewitt_x prewittx?算子的卷积可以分为先进行垂直方向的均值平滑,然后进行水平方向的差分。同理, p r e w i t t y prewitt_y prewitty?也可类似进行理解。

程序实现
import numpy as np
import cv2
from scipy import signal


def prewitt(I, _boundary='symm'):
    # prewitt_x卷积运算
    # 垂直方向的均值平滑
    ones_y = np.array([[1], [1], [1]], np.float32)
    i_conv_pre_x = signal.convolve2d(I, ones_y, mode='same', boundary=_boundary)
    # 水平方向的差分
    diff_x = np.array([[1, 0, -1]], np.float32)
    i_conv_pre_x = signal.convolve2d(i_conv_pre_x, diff_x, mode='same', boundary=_boundary)
    # prewitt_y卷积运算
    # 水平方向的均值平滑
    ones_x = np.array([[1], [1], [1]], np.float32)
    i_conv_pre_y = signal.convolve2d(I, ones_x, mode='same', boundary=_boundary)
    # 垂直方向的差分
    diff_y = np.array([[1, 0, -1]], np.float32)
    i_conv_pre_y = signal.convolve2d(i_conv_pre_y, diff_y, mode='same', boundary=_boundary)
    return i_conv_pre_x, i_conv_pre_y


if __name__ == "__main__":
    image = cv2.imread(r"C:\Users\1\Pictures\test1.jpg", 0)
    cv2.imshow("imgae", image)
    # 卷积,边界扩充采用symm
    i_conv_pre_x, i_conv_pre_y = prewitt(image)
    # 取绝对值
    abs_i_conv_pre_x = np.abs(i_conv_pre_x)
    abs_i_conv_pre_y = np.abs(i_conv_pre_y)
    # 边缘强度的灰度值显示
    edge_x = abs_i_conv_pre_x.copy()
    edge_y = abs_i_conv_pre_y.copy()
    # 截断
    edge_x[edge_x > 255] = 255
    edge_y[edge_y > 255] = 255
    # 类型转换
    edge_x = edge_x.astype(np.uint8)
    edge_y = edge_y.astype(np.uint8)
    cv2.imshow("edge_x", edge_x)
    cv2.imshow("edge_y", edge_y)
    # 求解边缘强度
    edge = 0.5 * i_conv_pre_x + 0.5 * i_conv_pre_y
    edge[edge > 255] = 255
    # 显示边缘
    edge = edge.astype(np.uint8)
    cv2.imshow("edge", edge)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果
在这里插入图片描述


  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:39:40  更:2022-05-09 12:40:17 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:35:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码