opencv_day10

#使用函数cv2.convertScaleAbs()对一个随机数组取绝对值
#opencv中,使用函数cv2.convertScaleAbs()对参数取绝对值,
#dst=cv2.convertScaleAbs(src [,alpha[,beta]])
#alpha代表调节系数,可选;beta是调节亮度值,是默认值,默认为0
import cv2
import numpy as np
img=np.random.randint(-256,256,size=[4,5],dtype=np.int16)
rst=cv2.convertScaleAbs(img)
print('img=\n',img)
print('rst=\n',rst)

输出:
img=
[[ 6 92 -56 98 -14]
[-194 -98 -236 175 -33]
[ 114 -228 -153 -102 -170]
[ -19 -138 23 -220 241]]
rst=
[[ 6 92 56 98 14]
[194 98 236 175 33]
[114 228 153 102 170]
[ 19 138 23 220 241]]

#通过实例介绍如何使用函数cv2.Sobel()获取图像边缘信息
import cv2
img=cv2.imread('./image/xintaixue.png',0)
#将深度设置为-1,那么输出就是8位图,负数截断为0
Sobelx=cv2.Sobel(img,-1,1,0)
cv2.imshow('original',img)
cv2.imshow('x',Sobelx)
cv2.waitKey()
cv2.destroyWindow()

输出:
在这里插入图片描述

#使用函数cv2.Sobel()获取图像水平方向的完整边缘信息
import cv2
img=cv2.imread('./image/xintaixue.png',0)
Sobelx=cv2.Sobel(img,cv2.CV_64F,1,0)
Sobelx=cv2.convertScaleAbs(Sobelx)
cv2.imshow('original',img)
cv2.imshow('x',Sobelx)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#使用函数cv2.Sobel()获取图像垂直方向的边缘信息
#使用函数cv2.convertScaleAbs()对函数cv2.Sobel()的计算结果取绝对值
#获取完整的垂直方向的边缘信息
import cv2
img=cv2.imread('./image/xintaixue.png',0)
Sobely=cv2.Sobel(img,cv2.CV_64F,0,1)
Sobely=cv2.convertScaleAbs(Sobely)
cv2.imshow('original',img)
cv2.imshow('y',Sobely)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#设置参数dx和dy的值为"dx=1.dy=1"时,查看执行效果
#这会获取两个方向上的边缘信息,若将ddpeth设置为CV_64F那么就不会截断负值
import cv2
img=cv2.imread('./image/xintaixue.png',0)
Sobelxy=cv2.Sobel(img,cv2.CV_64F,1,1)
Sobelxy=cv2.convertScaleAbs(Sobelxy)
cv2.imshow('original',img)
cv2.imshow('xy',Sobelxy)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#计算函数cv2.Sobel()在水平,垂直两个方向叠加的边缘信息
import cv2
img=cv2.imread('./image/xintaixue.png',-1)
Sobelx=cv2.Sobel(img,cv2.CV_64F,1,0)
Sobely=cv2.Sobel(img,cv2.CV_64F,0,1)
Sobelx=cv2.convertScaleAbs(Sobelx)
Sobely=cv2.convertScaleAbs(Sobely)
Sobelxy=cv2.addWeighted(Sobelx,0.5,Sobely,0.5,0)
cv2.imshow('original',img)
cv2.imshow('xy',Sobelxy)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#使用2种方法处理图像在两个方向的边缘信息
import cv2
img=cv2.imread('./image/iu.jpeg',0)
Sobelx=cv2.Sobel(img,cv2.CV_64F,1,0)
Sobely=cv2.Sobel(img,cv2.CV_64F,0,1)
Sobelx=cv2.convertScaleAbs(Sobelx)
Sobely=cv2.convertScaleAbs(Sobely)
Sobelxy=cv2.addWeighted(Sobelx,0.5,Sobely,0.5,0)
Sobelxy11=cv2.Sobel(img,cv2.CV_64F,1,1)
Sobelxy11=cv2.convertScaleAbs(Sobelxy11)
cv2.imshow('original',img)
cv2.imshow('xy',Sobelxy)
cv2.imshow('xy11',Sobelxy11)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#使用函数cv2.Scharr()获取图像水平方向的边缘信息
import cv2
img=cv2.imread('./image/xintaixue.png',0)
Scharrx=cv2.Scharr(img,cv2.CV_64F,1,0)
Scharrx=cv2.convertScaleAbs(Scharrx)
cv2.imshow('original',img)
cv2.imshow('Scharrx',Scharrx)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#使用函数cv2.Scharr()获取图像垂直方向的边缘信息
import cv2
img=cv2.imread('./image/xintaixue.png',0)
Scharry=cv2.Scharr(img,cv2.CV_64F,0,1)
Scharry=cv2.convertScaleAbs(Scharry)
cv2.imshow('original',img)
cv2.imshow('Scharrx',Scharry)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#使用函数cv2.Scharr()实现水平方向和垂直方向边缘叠加的效果
import cv2
img=cv2.imread('./image/iu.jpeg',0)
scharrx=cv2.Scharr(img,cv2.CV_64F,1,0)
scharry=cv2.Scharr(img,cv2.CV_64F,0,1)
scharrx=cv2.convertScaleAbs(scharrx)
scharry=cv2.convertScaleAbs(scharry)
scharrxy=cv2.addWeighted(scharrx,0.5,scharry,0.5,0)
cv2.imshow('original',img)
cv2.imshow('xy',scharrxy)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#观察将函数cv2.Scharr()的参数dx,dy同时设置为1时,程序的运行情况
import cv2
import numpy as np
img=cv2.imread('./image/iu.jpeg',0)
#不允许同时将dx与dy设置为1
Scharrxy11=cv2.Scharr(img,cv2.CV_64F,1,1)
Scharrxy11=cv2.convertScaleAbs(Scharrxy11)
cv2.imshow('original',img)
cv2.imshow('Scharrxy11',Scharrxy11)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
Traceback (most recent call last):
File “/home/sjj/PycharmProjects/day_01/OpenCvPro.py”, line 1925, in
Scharrxy11=cv2.Scharr(img,cv2.CV_64F,1,1)
cv2.error: OpenCV(4.1.1) /io/opencv/modules/imgproc/src/deriv.cpp:67: error: (-215:Assertion failed) dx >= 0 && dy >= 0 && dx+dy == 1 in function ‘getScharrKernels’

#使用函数cv2.Sobel()中ksize的参数值为-1时,就会使用Scharr算子进行运算
import cv2
img=cv2.imread('./image/xintaixue.png',0)
Scharrx=cv2.Sobel(img,cv2.CV_64F,1,0,-1)
Scharry=cv2.Sobel(img,cv2.CV_64F,0,1,-1)
Scharrx=cv2.convertScaleAbs(Scharrx)
Scharry=cv2.convertScaleAbs(Scharry)
cv2.imshow('original',img)
cv2.imshow('Scharrx',Scharrx)
cv2.imshow('Scharry',Scharry)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

#Sobel算子和Scharr算子的比较
#Sobel算子的缺点是,当其核结构较小时,精确度不高,而Scharr算子有更高的精确度
#分别使用Sobel算子和Scharr算子来计算一幅图像的水平边缘和垂直边缘的叠加信息
import cv2
img=cv2.imread('./image/iu.jpeg',0)
Sobelx=cv2.Sobel(img,cv2.CV_64F,1,0)
Sobelx=cv2.convertScaleAbs(Sobelx)
Sobely=cv2.Sobel(img,cv2.CV_64F,0,1)
Sobely=cv2.convertScaleAbs(Sobely)
Scharrx=cv2.Scharr(img,cv2.CV_64F,1,0)
Scharrx=cv2.convertScaleAbs(Scharrx)
Scharry=cv2.Scharr(img,cv2.CV_64F,0,1)
Scharry=cv2.convertScaleAbs(Scharry)
cv2.imshow('original',img)
cv2.imshow('Sobelx',Sobelx)
cv2.imshow('Sobely',Sobely)
cv2.imshow('Scharrx',Scharrx)
cv2.imshow('Scharry',Scharry)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

#使用函数cv2.Laplacian()计算图像的边缘信息
#拉普拉斯算子是一种二阶导数算子,具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求,但是通常情况下,其算子的系数之和需要为0.
import cv2
img=cv2.imread('./image/iu.jpeg',0)
Laplacian=cv2.Laplacian(img,cv2.CV_64F)
Laplacian=cv2.convertScaleAbs(Laplacian)
cv2.imshow('original',img)
cv2.imshow('Laplacian',Laplacian)
cv2.waitKey()
cv2.destroyAllWindows()

输出:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值