OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。官方下载链接如下:https://opencv.org/releases/
安装完毕后,在python中导入cv2库就可以使用OpenCV的API。
img = cv2.imread("sf.jpg")
>>> type(img)
<class 'numpy.ndarray'>
>>> img.shape
(333, 500, 3)
>>> img[0,0]
array([16, 16, 16], dtype=uint8)
>>> img[0,0,1]
16
一个OpenCV图像是 numpy 二维(灰度图)或者三维数组(彩图)。
img[y,x] 表示二维图 y行 x列处像素点的亮度值。
img[y,x,c]表示三维图 y行x列出像素点通道c的亮度值。
像素的亮度值用一个无符号的8位整数表示,所以范围在0到255。
可以只加载灰度图:
img3 = cv2.imread("sf.jpg", cv2.IMREAD_GRAYSCALE)
#因为cv2.IMREAD_GRAYSCALE=0
#可以简写为 img3 = cv2.imread("sf.jpg", 0)
img = cv2.imread("sf.jpg")
cv2.imshow("Sophie Marceau", img) #第一个参数为窗口标题
#创建一个合法的随机数组并显示
img2 = np.random.randint(256,size =(200,400,3),dtype =np.uint8)
cv2.imshow("random pix", img2)
img = cv2.imread("hua.jpg")
img_reverse = 255- img #明暗颠倒
cv2.imwrite("jiangshan_r.PNG", img_reverse)
B,G,R = cv2.split(img) #分离通道,注意顺序:蓝,绿,红
G[:,:]=0 #绿色通道清零
R[:,:]=0 #红色通道清零
img_blue = cv2.merge((B,G,R)) #合并三通道
cv2.imshow("blue chanel", img_blue)
#其实也可以只用numpy操作
img_blue = img.copy()
img_blue[:,:,1:3]=0
cv2.imshow("blue chanel _", img_blue)
又如使用如下之类的核(后面会介绍),中间元素为正,周围元素为负,核中所有的值之和为0: kernel = np.array([[-1, -1, -1], [-1, 8, 1], [-1, -1, -1]])
#下面的核会使图像锐化
kernel = np.array([[-1, -1, -1],
[-1, 9, 1],
[-1, -1, -1]])
img_new = cv2.filter2D(img, -1, kernel)
cv2.imshow("sharpening", img)
##下面的核会使图像产生浮雕效果
kernel2 = np.array([[-2, -1, 0],
[-1, 0, 1],
[0, 1, 2]])
img_embossed = cv2.filter2D(img, -1, kernel2)
cv2.imshow("embossed", img_embossed)
嗯,黑了点...
#k=3, 5, 7, 9 共四级模糊效果,k越大越模糊
for k in range(3,10,2):
knrnel3 = np.array([[1.0/k**2]*k for i in range(k)])
img_edges = cv2.filter2D(img, -1 ,knrnel3)
cv2.imwrite("blurring k=%d.jpg"%k,img_edges)#保存图像
cv2.imshow("blurring k=%d"%k,img_edges)
原图:
边缘:
2.也可以使用Laplacian()函数:
def strokeEdges(src, blurKsize=7, edgeKsize=5): #两个ksize须为奇数
if blurKsize >3:
blurredSrc =cv2.medianBlur(src, blurKsize) #模糊函数,用于降噪
graySrc = cv2.cvtColor(blurredSrc,cv2.COLOR_BGR2GRAY)#转灰度图
else:#关闭模糊
graySrc = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)#转灰度图
#边缘检测 edgeKsize越大越灵敏,但可能越多noise
graySrc=cv2.Laplacian(graySrc, cv2.CV_8U, ksize=edgeKsize)#得到白色边缘,黑色背景
#cv2.imshow("edges0", graySrc)
normlizedInverseAlpha = graySrc/255.0
channels = cv2.split(src)# 通道分离,注意顺序BGR不是RGB
for channel in channels:
channel[:] = channel * normlizedInverseAlpha # 边缘映射到原图(会保留色彩)
return cv2.merge(channels)
img_old = cv2.imread(r"hua.jpg")
cv2.imshow("old", img_old)
edges = strokeEdges(img_old,blurKsize=7, edgeKsize=5) #两个ksize须为奇数
grayEdges = cv2.cvtColor(edges,cv2.COLOR_BGR2GRAY)#转灰度图
cv2.imshow("edges", edges)
#cv2.imshow("edges_GRAY", grayEdges)
cv2.waitKey()
cv2.destroyAllWindows()
3. 还可以考虑非常方便的Canny()函数:
'''
Canny(...)
Canny(image, threshold1, threshold2[,
edges[, apertureSize[, L2gradient]]]) -> edges
'''
#image:源图像
#threshold1:阈值1
#threshold2:阈值2
#apertureSize:可选参数,Sobel算子的大小
#其中,较大的阈值2用于检测图像中明显的边缘,但一般情况下检测的效果不会那么完美,
#边缘检测出来是断断续续的。所以这时候用较小的第一个阈值用于将这些间断的边缘连接起来。
#函数返回的是二值图,包含检测出的边缘
img = cv2.imread("hua.jpg")
edges = cv2.Canny(img,20,120)
cv2.imshow("original", img)
cv2.imshow("canny",edges)
cv2.waitKey()
cv2.destroyAllWindows()
本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体分享计划 ,欢迎热爱写作的你一起参与!