实验三 边缘检测算子()

一、题目描述
利用opencv或其他工具编写程序实现边缘检测算子。先读取图片,然后对图像反色,最后分别输出sobel、robert、gauss算子边缘检测的结果。
1、掌握对图片反色的操作
2、理解sobel算子边缘检测
3、理解robert算子边缘检测
4、理解gauss算子边缘检测
二、实现过程

 #导入库
import cv2
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image, ImageDraw, ImageFont
#用于给图片添加中文字符
def ImgText_CN(img, text, left, top, textColor=(0, 255, 0), textSize=20):if (isinstance(img, np.ndarray)):  #判断是否为OpenCV图片类型img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))draw = ImageDraw.Draw(img)fontText = ImageFont.truetype("font/simhei.ttf", textSize, encoding="utf-8")draw.text((left, top), text, textColor, font=fontText)return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)
### 图片反色
def inverse_color(image):height,width,temp = image.shapeimg2 = image.copy()for i in range(height):for j in range(width):img2[i,j]=(255-image[i,j][0],255-image[i,j][1],255-image[i,j][2]) return img2
# 读取图像
img = cv2.imread('dip_switch_02.bmp')
# 显示原图
show=ImgText_CN(img,"原图",5,5,(255, 0, 0), 20)
cv2.imshow("image",show)
# 反色
img1 = inverse_color(img)
show=ImgText_CN(img1,"反色图",5,5)
cv2.imshow("image2",show)# Sobel算子边缘检测
sobelx = cv2.Sobel(img1,cv2.CV_16S,1,0)
sobely = cv2.Sobel(img1,cv2.CV_16S,0,1)
sobelx = cv2.convertScaleAbs(sobelx)
sobely = cv2.convertScaleAbs(sobely)
sobelXY = cv2.addWeighted(sobelx,0.5,sobely,0.5,0)
show=ImgText_CN(inverse_color(sobelXY),"sobel算子边缘检测结果",5,5,(255, 0, 0), 20)
cv2.imshow("Sobel",show)#Robert算子边缘检测
kernelx = np.array([[-1,0],[0,1]], dtype=int)
kernely = np.array([[0,-1],[1,0]], dtype=int)
x = cv2.filter2D(img1, cv2.CV_16S, kernelx)
y = cv2.filter2D(img1, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX,0.5,absY,0.5,0)
show=ImgText_CN(inverse_color(Roberts),"robert算子边缘检测结果",5,5,(255, 0, 0), 20)
cv2.imshow("Robert",show)# Guass算子边缘检测
gray_lap=cv2.Laplacian(img1,cv2.CV_16S,ksize=5)
gauss_img=cv2.convertScaleAbs(gray_lap)
dst3=cv2.bitwise_not(gauss_img)
show=ImgText_CN(dst3,"gauss算子边缘检测结果",5,5,(255, 0, 0), 20)
cv2.imshow("Gauss",show)
# 销毁资源
cv2.waitKey(0)
cv2.destroyAllWindows()

三、运行结果




四、问题及解决方法
问题1:“原图”文本在后续对图片的操作中出现。
分析:原因是我直接在原图上添加了文字,导致后面用原图操作时,文字还在上面。解决:添加文字的图片要重新赋值,不要和原图搞混了。
问题2:puttext添加中文,显示是乱码。
分析:puttext本身并不支持中文,如果一定要输出中文就需要FreeType字体库进行处理,在python可以通过PIL转换一下。本次实验,我使用了自定义函数ImgText_CN,通过PIL库实现的。
问题3:在实验室的电脑上写中文时会报错。SyntaxError: Non-ASCII character ‘\xe4’ in file test.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
分析:由于Python中默认的编码格式是 ASCII 格式,在没修改编码格式时无法正确打印汉字,所以在读取中文时会报错。解决方法为只要在文件开头加入 # -- coding: UTF-8 -- 或者 #coding=utf-8 就行了

机器视觉OpenCV-sobel、robert、gauss算子边缘检测相关推荐

  1. 使用Visual Studio+OpenCV进行的Susan算子边缘检测及数米粒图像处理实验

    一.实验内容 用计算机视觉的方法数米粒. 二.实验目的及意义 计算机视觉的应用非常广泛,本实验就是让同学们对计算机视觉技术的应用有一个简单的了解. 1.了解计算机视觉的实验环境.本实验选用的是 VS+ ...

  2. [Python从零到壹] 五十八.图像增强及运算篇之图像锐化Sobel、Laplacian算子实现边缘检测

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  3. 边缘检测的各种微分算子比较(Sobel,Robert,Prewitt,Laplacian,Canny)

    边缘检测的各种微分算子比较(Sobel,Robert,Prewitt,Laplacian,Canny) 不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像.需要说明的是:边缘和物体间的 ...

  4. CUDA精进之路(四):图像处理——Sobel算子边缘检测

    引言 关于图像边缘检测,记得刚开始接触图像处理时,第一个自己实现的程序是通过笔记本摄像头采集图像,利用OpenCV自带的算法库进行Canny算子边缘检测,那时候当看到程序运行后,视频窗口实时显示经Ca ...

  5. OpenCV Sobel 边缘检测

    Sobel算子检测方法对灰度渐变和噪声较多的图像处理效果较好,sobel算子对边缘定位不是很准确,图像的边缘不止一个像素:当对精度要求不是很高时,是一种较为常用的边缘检测方法. OpenCV中sobe ...

  6. Matlab图像边缘检测Roberts\Sobel\Prewitt\Canny算子

    确定图像中的物体边界的一种方法是先检测每个像素和其直接淋雨的状态已决定该像素是否确实处于一个物体的边界上.具有这种特性的像素被标记为边缘点.当图像中各个像素的灰度级用来反映各像素要求的程度时,这种图像 ...

  7. FPGA图像处理——sobel算子边缘检测

    一.sobel算子边缘检测理论 sobel算子是广泛应用的微分算子之一,可以计算图像处理中的边缘检测,计算图像的灰度地图.在技术上,它是一个离散的一阶差分算子,用来计算图像亮度函数的一阶梯度之近似值. ...

  8. 基于OpenCV的图像梯度与边缘检测!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:姚童,Datawhale优秀学习者,华北电力大学 严格的说,梯度计 ...

  9. opencv 梯度幅值_基于OpenCV的图像梯度与边缘检测!

    严格的说,梯度计算需要求导数.但是图像梯度的计算,是通过计算像素值的差得到梯度的近似值.图像梯度表示的是图像变化的速度,反映了图像的边缘信息. 边缘是像素值快速变化的地方.所以对于图像的边缘部分,其灰 ...

  10. OpenCV入门(四)——边缘检测

    目录 0x01 梯度算子 0x02 一阶微分算子 0x03 二阶微分算子 0x04 图像差分运算 0x05 非极大值抑制 0x06 基本边缘算子--Sobel 0x07 基本边缘算子--Laplace ...

最新文章

  1. Java中的访问权限
  2. 自定义视图 视图控制器(UIViewController)
  3. 详解深度学习中的Normalization,不只是BN(2)
  4. centos 7 源码方式安装mysql5.6
  5. 我们为什么使用Node
  6. .net mysql 工作流_一个适合于.NET Core的超轻量级工作流引擎:Workflow-Core
  7. Nginx+DNS负载均衡实现
  8. linux 安装Paramiko模块安装和使用
  9. Dos window下运行java程序
  10. 循道 | 富达投资的技术控为何摇身变成资管掌门人
  11. 【AWVS12】安全漏洞扫描工具,使用详解
  12. MAE,何凯明-2021
  13. LaTeX插入参考文献教程 | 非BibTeX格式
  14. 2021TIOBE 11月榜单:Python蝉联榜首,PHP前十“岌岌可危”
  15. 自己实现Latex公式识别
  16. “3D游戏之父”手游考古,网友:求支持智能手机!
  17. android xposed如何写,安卓Hook系列教程(一):xposed模块开发环境搭建
  18. vue通过v-if隐藏的元素在网页加载时闪现
  19. 程序员们,千万不要接私活!
  20. tensorflow示例代码注释2

热门文章

  1. IQR(Inter-Quartile Range)
  2. python大侠个人信息查询_个人信息查询,教你怎么调查一个人的资料
  3. Java:轻松一刻/程序员才懂的幽默
  4. response返回中文乱码
  5. 进击的“懒人经济”,快手又迎来一个万亿蓝海市场
  6. python招聘杭州拉勾网_Python爬取拉勾网招聘信息
  7. c语言 程序设计 题库答案 p,《C语言程序设计》复习题库答案.doc
  8. 【计算机网络】5G网络结构————5G技术大有可为
  9. 磁盘列阵技术介绍及其部署
  10. 2021年前端部署的灵魂拷问