第八节:边缘检测

边缘检测:边缘检测指的是灰度值发生急剧变化的位置,边缘检测的目的是制作一个线图,在不会损害理解图像内容的情况下, 有大大减少了图像的数据量,提供了对图像数据的合适概述。

一:Roberts算子

代码实现:

import cv2
import numpy as np
from scipy import signaldef roberts(I, _boundary='fill', _fillvalue=0):# 图像的高,宽H1, W1 = I.shape[0:2]# 卷积核的尺寸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)kr2, kc2 = 0, 1# 再计算full卷积IconR2 = signal.convolve2d(I, R2, mode='full', boundary=_boundary, fillvalue=_fillvalue)IconR2 = IconR2[H2-kr2-1:H1+H2-kr2-1, W2-kc2-1:W1+W2-kc2-1]return (IconR1, IconR2)if __name__ == '__main__':I = cv2.imread('img3.png', cv2.IMREAD_GRAYSCALE)# 显示原图cv2.imshow('origin', I)# 卷积,注意边界一般扩充采用的symmIconR1, IconR2 = roberts(I, 'symm')# 45度方向上的边缘强度的灰度级显示IconR1 = np.abs(IconR1)edge45 = IconR1.astype(np.uint8)cv2.imshow('edge45', edge45)# 135度方向上的边缘强度的灰度级显示IconR2 = np.abs(IconR2)edge135 = IconR2.astype(np.uint8)cv2.imshow('edge135', edge135)# 用平方和的开方来衡量最后输出的边缘edge = np.sqrt(np.power(IconR1, 2.0) + np.power(IconR2, 2.0))edge = np.round(edge)edge[edge > 255] = 255edge = edge.astype(np.uint8)# 显示边缘cv2.imshow('edge', edge)cv2.waitKey(0)cv2.destroyAllWindows()

输出结果:

二: Prewitt边缘检测

代码实现:

import cv2
import numpy as np
from scipy import signaldef prewitt(I, _boundary = 'symm', ):# prewitt算子是可分离的。 根据卷积运算的结合律,分两次小卷积核运算# 算子分为两部分,这是对第一部分操作# 1: 垂直方向上的均值平滑ones_y = np.array([[1], [1], [1]], np.float32)i_conv_pre_x = signal.convolve2d(I, ones_y, mode='same', boundary=_boundary)# 2: 水平方向上的差分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)# 算子分为两部分,这是对第二部分操作# 1: 水平方向上的均值平滑ones_x = np.array([[1, 1, 1]], np.float32)i_conv_pre_y = signal.convolve2d(I, ones_x, mode='same', boundary=_boundary)# 2: 垂直方向上的差分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__':I = cv2.imread('img7.jpg', cv2.IMREAD_GRAYSCALE)cv2.imshow('origin', I)i_conv_pre_x, i_conv_pre_y = prewitt(I)# 取绝对值,分别得到水平方向和垂直方向的边缘强度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()# 将大于255的值截断为255edge_x[edge_x > 255] = 255edge_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)# 利用abs_i_conv_pre_x 和 abs_i_conv_pre_y 求最终的边缘强度# 求边缘强度有多重方法, 这里使用的是插值法edge = 0.5 * abs_i_conv_pre_x + 0.5 * abs_i_conv_pre_y# 边缘强度灰度级显示edge[edge > 255] = 255edge = edge.astype(np.uint8)cv2.imshow('edge', edge)cv2.waitKey(0)cv2.destroyAllWindows()

输出结果:

三:Sobel边缘检测

代码实现:

import math
import cv2
import numpy as np
from scipy import signaldef pascalSmooth(n):# 返回n阶的非归一化的高斯平滑算子pascalSmooth = np.zeros([1, n], np.float32)for i in  range(n):pascalSmooth[0][i] = math.factorial(n - 1) / (math.factorial(i) * math.factorial(n-1-i))return pascalSmoothdef pascalDiff(n):      # 在一半之前是逐差法。。后半部分的值和前半部分对应# 返回n阶差分算子pascalDiff = np.zeros([1, n], np.float32)pascalSmooth_previous = pascalSmooth(n - 1)for i in range(n):if i == 0:# 恒等于1pascalDiff[0][i] = pascalSmooth_previous[0][i]elif i == n-1:pascalDiff[0][i] = pascalSmooth_previous[0][i-1]else:pascalDiff[0][i] = pascalSmooth_previous[0][i] - pascalSmooth_previous[0][i-1]return pascalDiffdef getSmoothKernel(n):# 返回两个sobel算子pascalSmoothKernel = pascalSmooth(n)pascalDiffKernel = pascalDiff(n)# 水平方向上的卷积核sobelKernel_x = signal.convolve2d(pascalSmoothKernel.transpose(), pascalDiffKernel, mode='full')# 垂直方向上的卷积核sobelKernel_y = signal.convolve2d(pascalSmoothKernel, pascalDiffKernel.transpose(), mode='full')return (sobelKernel_x, sobelKernel_y)def sobel(image, n):rows, cols = image.shape# 得到平滑算子pascalSmoothKernel = pascalSmooth(n)# 得到差分算子pascalDiffKernel = pascalDiff(n)# 与水平方向的sobel核卷积# 先进行垂直方向的平滑image_sobel_x = signal.convolve2d(image, pascalSmoothKernel.transpose(), mode='same')# 再进行水平方向的差分image_sobel_x = signal.convolve2d(image_sobel_x, pascalDiffKernel, mode='same')# 与垂直方向的sobel核卷积# 先进行水平方向的平滑image_sobel_y = signal.convolve2d(image, pascalSmoothKernel, mode='same')image_sobel_y = signal.convolve2d(image_sobel_y, pascalDiffKernel.transpose(), mode='same')return (image_sobel_x, image_sobel_y)if __name__ == '__main__':I = cv2.imread('img7.jpg', cv2.IMREAD_GRAYSCALE)cv2.imshow('origin', I)# 卷积image_sobel_x, image_sobel_y = sobel(I, 7)# cv2.imshow('image_sobel_x', image_sobel_x)# cv2.imshow('image_sobel_y', image_sobel_y)# 平方和的方式展开edge = np.sqrt(np.power(image_sobel_x, 2.0) + np.power(image_sobel_y, 2.0))# 边缘强度的灰度级显示edge = edge / np.max(edge)edge = np.power(edge, 1)edge = edge * 255edge = edge.astype(np.uint8)cv2.imshow('edge', edge)cv2.waitKey(0)cv2.destroyAllWindows()

输出结果:

    后面出一节,狂调API。。。无需实现这些算法,只需知道在opencv中怎么调用。

【8】python-opencv3教程:边缘检测(Roberts算子边缘检测,Prewitt算子边缘检测,Sobel算子边缘检测)相关推荐

  1. 图像处理——Canny算子 图像边缘检测:Canny算子、Prewitt算子和sobel算子

    https://blog.csdn.net/fengye2two/article/details/79190759 https://www.jianshu.com/p/bed4ffe996a1

  2. 《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  3. 边缘提取——Prewitt算子和Sobel算子

    目录 Prewitt算子和Sobel算子 理论介绍 编码实现(Python) debug过程 Prewitt算子和Sobel算子 理论介绍 Prewitt算子和Sobel算子也是基于一阶导数的算子. ...

  4. sobel算子_OpenCV 学习:4 Sobel算子

    1 背景介绍 图像底层的处理对象,比如图像的噪点.边缘.直线.圆.特征点等为目的.那么本章主要解决的问题是如何提取图形中的边缘?是我们关心中的重点.那么,其数学原理是一阶离散差分的形式.故我们知道把一 ...

  5. [Python图像处理] 十八.图像锐化与边缘检测之Scharr算子、Canny算子和LOG算子

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  6. CV笔记6:图像边缘检测之一阶微分算子、二阶微分算子、Canny边缘检测(基于python-opencv实现)

    目录 一.边缘简介 1.1 何为边缘 1.2 产生原因 二.边缘检测方法 2.1 一阶微分算子计算原理 2.2 噪声对一阶微分算子的影响及解决方案 2.3 常见的一阶微分算子 2.3.1 Robert ...

  7. OpenCV(十五)边缘检测1 -- Sobel算子(一阶微分算子,X、Y方向边缘检测)

    目录 一.边缘检测基础理论 1.作用: 2.分类 1.基于搜索 2.基于零穿越 3.算子比较 二.Sobel算子基础理论 1.作用 2.原理及推导 3.更详细推导 4.Sobel函数 二.实战 1.对 ...

  8. 屏幕后期处理之:Sobel算子实现边缘检测

    版权声明 本文为"优梦创客"原创文章,您可以自由转载,但必须加入完整的版权声明 更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商 ...

  9. 数字图像处理第三章边缘检测(Sobel算子、Laplace算子)

    边缘 边缘(edge)是指图像局部强度变化最显著的部分.主要存在于目标与目标.目标与背景.区域与区域(包括不同色彩)之间,是图像分割.纹理特征和形状特征等图像分析的重要基础. 边缘检测概念 1.边缘检 ...

  10. python边缘检测画简笔画_python计算机视觉2:图像边缘检测

    标签: 我是一名初学者,如果你发现文中有错误,请留言告诉我,谢谢 如果需要检测到图像里面的边缘,首先我们需要知道边缘处具有什么特征. 对于一幅灰度图像来说,边缘两边的灰度值肯定不相同,这样我们才能分辨 ...

最新文章

  1. spring读取配置文件的几种方式
  2. Redis 高可用特性之 “持久化” 详解
  3. MPDU 和 MSDU 的区别及关系
  4. 最佳的七十五个网络分析和安全工具
  5. Entity Framework part2
  6. 将数据转化成字符串时:用字符串的链接 还是 StringBuilder
  7. python面向对象(下)
  8. python中class_【机器学习基础】数学推导+纯Python实现机器学习算法11:朴素贝叶斯...
  9. 新年新服务: MVP 播客上线
  10. Spark on yarn 动态资源配置
  11. caffe 将数据(非图像和图像)转成lmdb格式的数据
  12. 红帽linux oracle,Oracle Linux与红帽Linux对比
  13. Mac10.14版本安装虚拟机Parallels Desktop 14和windows7 64位旗舰版镜像
  14. 使用无序列表ul实现多级菜单
  15. Java 中获取错误代码_错误代码:99999, 错误信息:无法获取到文件名
  16. 【web前端】小人行走
  17. 数学之美——信息的度量
  18. 【金猿人物展】树根互联COO黄路川:从“灯塔工厂”到“数字领航”,工业互联网操作系统助推新型工业化...
  19. 【java】tomcat配置域名访问并修改端口号
  20. 【资源分享】综合性的导航网站

热门文章

  1. 观众网app android,观众网app
  2. 邻接矩阵的c语言算法思路,C语言邻接矩阵的实现
  3. Endnote X8 与 Word 2013关联(win10系统)
  4. 【vcpkg】vcpkg:用于 Windows、Linux 和 macOS 的 C++ 包管理器
  5. C++:实现量化期权定价理论方法之一Bates模型测试实例
  6. 安装Sourcetree项目开发工具
  7. CQ: 字节系创作质量中台实践
  8. 很全的饮食英语词汇表
  9. 1.几种简单矩阵计算的Fortran实现
  10. 十年没涨过工资,中国的GDP都到哪…