边缘检测算子
一、题目描述
将图像进行反色显示
进行Sobel算子滤波再将其反色显示
进行Roberts算子滤波再将其反色显示
二、实现过程
代码:
import cv2 import numpy as np from matplotlib import pyplot as plt from PIL import Image, ImageDraw, ImageFont plt.rcParams['font.family'] = ['sans-serif'] plt.rcParams['font.sans-serif'] = ['SimHei'] # 读取图像 src_s = cv2.imread("C:/Users/dell/Desktop/dip.bmp") #反色 ret,src = cv2.threshold(src_s,80,255,cv2.THRESH_BINARY) src = cv2.bitwise_not(src_s) cv2.imshow('src',src) #Sobel算子滤波 x=cv2.Sobel(src,cv2.CV_16S,0,1)#对x求一阶导 y=cv2.Sobel(src,cv2.CV_16S,0,1)#对y求一阶导 absx=cv2.convertScaleAbs(x)#计算绝对值,并将图像转换为8位图进行显示 absy=cv2.convertScaleAbs(y) sobel=cv2.addWeighted(absx,0.5,absy,0.5,0)#将图像进行线性混合 #反色 ret,sobel2 = cv2.threshold(sobel,80,255,cv2.THRESH_BINARY) sobel2 = cv2.bitwise_not(sobel) cv2.imshow('sobel2',sobel2) cv2.waitKey(0) #robert算子滤波 lenna_img = cv2.cvtColor(src,cv2.COLOR_BGR2RGB) #灰度化处理图像 grayImage = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY) #Roberts算子 kernelx = np.array([[-1,0],[0,1]], dtype=int) kernely = np.array([[0,-1],[1,0]], dtype=int) x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)#filter2D实现边缘提取 y = cv2.filter2D(grayImage, cv2.CV_16S, kernely) #转uint8 absX = cv2.convertScaleAbs(x) absY = cv2.convertScaleAbs(y) robert = cv2.addWeighted(absX,0.5,absY,0.5,0) ret,robert2= cv2.threshold(robert,80,255,cv2.THRESH_BINARY) robert2 = cv2.bitwise_not(robert) cv2.imshow('robert2',robert2) cv2.waitKey(0)
三、运行结果
截图
四、问题及解决方法
error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
在读取桌面文件的时候一直报错:(unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
路径错误,找到图片打开属性复制路径,后还是不对,后把“\”换为”/”即可运行
五、实验总结
本次实验不难,学到了Sobel,Roberts,明白了遇到问题需要思考到底是那个地方错误,在网上寻找之后筛选有用的解答就可以解决问题。