python图像边缘opencv_Python+OpenCV实现图像边缘检测算子SOBEL、ROBERT

在Jupyter Notebook上使用Python实现图像边缘检测算子SOBEL、ROBERT,这个过程中实现某些功能处理出来的图像可能会有点粗糙。关于opencv库的安装可以参考:Python下opencv库的安装过程与一些问题汇总。

1.实现代码

importcv2importnumpy as npimportmatplotlib.pyplot as plt#实现图片反色功能

defPointInvert(img):

height, width, _=img.shapefor i inrange(height):for j inrange(width):

pi=img[i, j]

img[i, j]= 255 -pireturnimg#读取原灰度图片

src_s=cv2.imread("dip_switch_02.bmp")

cv2.imshow("src_s", src_s)#将原图片命名为“src_s”显示出来#图片反色

src=PointInvert(src_s)

cv2.imshow("src", src)#将图片src_s反色处理后命名为“src”并显示出来

#SOBEL算子

sobel = cv2.Sobel(src,cv2.CV_64F, 1, 1, ksize=7)

cv2.imshow("sobel", sobel)#将SOBEL算子处理后的图片src命名为“sobel”并显示出来#图片反色

sobel2=PointInvert(sobel)

cv2.imshow("sobel2", sobel2)#将图片sobel反色处理后命名为“sobel2”并显示出来

#ROBERT算子

defRobert(img):

h,w,_=img.shape

rob= [[-1,-1],[1,1]]for x inrange(h):for y inrange(w):if (y + 2 <= w) and (x + 2 <=h):

imgChild= img[x:x+2, y:y+2, 1]

list_robert= rob*imgChild

img[x, y]= abs(list_robert.sum())#求和加绝对值

returnimg

robert=Robert(src)

cv2.imshow("robert", robert)#将ROBERT算子处理后的图片src命名为“robert”并显示出来

#图片反色

robert2=PointInvert(robert)

cv2.imshow("robert2", robert2)#将图片robert反色处理后命名为“robert2”并显示出来

cv2.waitKey(0)

2.运行结果

1785235-20200405215327040-152984503.png

1785235-20200405215341996-483411081.png

1785235-20200405215354684-1160716033.png

1785235-20200405215405667-1878414226.png

1785235-20200405215416781-1983536603.png

1785235-20200405215427908-821027626.png

3.遇到的问题及解决方法

(1) 运行时出现:ValueError: too many values to unpack(expect 2)

出错代码:h,w = img.shape

出错原因:

首先了解img.shape[0]、[1]、[2]。

img.shape[0]:图像的垂直尺寸(高度)

img.shape[1]:图像的水平尺寸(宽度)

img.shape[2]:图像的通道数

在矩阵中,[0]就表示行数,[1]则表示列数。

由此可知,img.shape默认返回值个数为3个,而我没有指明缺失的参数。

解决方法:

此处未用到的参数为图像的通道数,使用_代表用不到的参数,将代码h,w = img.shape改为h,w,_ = img.shape。

(2) 运行时出现:ValueError: operands could not be broadcast together with shapes (2,2) (2,2,3)

出错代码:list_robert = rob*imgChild

出错原因:

经过网上搜索解决方法,发现是违反了ufunc的广播机制。广播机制如下:

当使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同)。如果两个数组的shape不同的话,会进行如下的广播(broadcasting)处理:

1)让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐。

2)输出数组的shape是输入数组shape的各个轴上的最大值。

3)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错。

4)当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值。

我们图片的shape是(h,w,c),而列表的shape是(x:x+2, y:y+2),根据规则1可知列表的shape拓展应为(x:x+2, y:y+2,1);由规则2可知输出数组的shape应为(h,w,c),列表的shape不满足规则3,所以出错。

解决方法:

将代码imgChild = img[x:x+2, y:y+2]改为imgChild = img[x:x+2, y:y+2, 1]。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值