第八节:边缘检测

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

一: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. 二进制数据格式MessagePack:比JSON更快更轻巧
  2. 图像处理学习三(频域图像增强)
  3. 代码实现UISlider 和 UISwitch
  4. 初识Nginx服务器
  5. 调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试调试
  6. js 操作frameset frame 对象
  7. Java set的区别_Java Set集合详解及Set与List的区别
  8. UVA489 Hangman Judge【模拟】
  9. VS2012下MFC程序的换肤(Skin++、SkinMagic、USkin、SkinSharp)
  10. 汽车零配件行业MES系统,你了解多少?
  11. 波长缩短系数matlab,波长缩短效应,天线缩短系数:天线末端效应、相位常数
  12. dstwo linux 模拟器,DSTWO专用插件GBA模拟器(TempGBA)下载 v1.44
  13. 客户体验的时代(2001.12)
  14. YOLOX: Exceeding YOLO Series in 2021
  15. java编程:对两个分数进行简单的算术运算
  16. 成都拓嘉启远:拼多多下单后地址错误能改吗
  17. excel小写转大写公式_Excel办公技巧:快速将单元格中小写字母全部转换为大写字母...
  18. matlab矩阵逆时针旋转90度
  19. 黑马JavaWeb全功能综合案例(element-ui+mybatis+Vue+ajax)
  20. 【动态规划】线性动态规划

热门文章

  1. mysql脚本文件生成工具_SqlDataToScript(sql脚本生成工具)
  2. Hibernate二级缓存详解(转)
  3. 【元胞自动机】元胞自动机生命游戏【含Matlab源码 655期】
  4. 【复现笔记】clean-pvnet复现
  5. 关于自动更换xp桌面的壁纸。
  6. Smartline IE V3 触摸屏项目下载的具体步骤以及注意事项
  7. oc和java的优点缺点_oc语言的优点和缺点
  8. python初学-下载模块后导入失败(windows)
  9. linux终端jar命令无法使用
  10. 经典DS证据理论下的设备故障诊断原理及示例