pillow相对于OpenCV 来讲,它还是弱小很多。跟很多开源软件一样 OpenCV 也提供了完善的 Python 接口, 非常便于调用。OpenCV 的稳定版是 2.4.8,最新版是 4.2.0,包含了超过 2500 个算法和函数, 几乎任何一个能想到的成熟算法都可以通过调用 OpenCV 的函数来实现,超级方便。
OpenCV 的优点
- OpenCV 是跨平台的,可以在 Windows、Linux、Mac OS、Android、iOS 等操作系统上运行。
- OpenCV 的应用领域非常广泛,包括图像拼接、图像降噪、产品质检、人机交互、人脸识别、动作识别、动作跟踪、无人驾驶等。
- OpenCV 还提供了机器学习模块,可以使用正态贝叶斯、K最近邻、支持向量机、决策树、随机森林、人工神经网络等机器学习算法。
使用pip安装OpenCV:
pip install opencv-python
也可以使用anaconda安装,同样方便快捷。
import cv2
from matplotlib import pyplot as plt
img = cv2.imread( '/data/demo/L1020120.JPG')
--------------------------------------------------------------------------- ModuleNotFoundError Traceback (most recent call last) Cell In[2], line 1 ----> 1 import cv2 2 from matplotlib import pyplot as plt 3 img = cv2.imread( 'L1020120.JPG') ModuleNotFoundError: No module named 'cv2'
同样使用matplotlit库进行查看。
from matplotlib import pyplot as plt
plt.imshow(img)
plt.show()
可以看出,图像的颜色显示不正常。
这是因为matplotlib使用的颜色模式是现在流行的RGB模式,而opencv使用的是BGR模式, 即RGB的倒序模式,与通常的RGB是反向的。 因此在使用matplotlib显示之前需要做一下图像颜色的转换。
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imwrite('./xx_opencv_out.jpg',img,
[int( cv2.IMWRITE_JPEG_QUALITY), 95])
imgflip = cv2.flip(img,0)
import numpy as np
img = np.zeros((512,512,3), np.uint8)
cv2.line(img,(0,0),(511,511),(0,255,0),5); pass
cv2.rectangle(img,(390,0),(510,120),(0,255,0),3); pass
cv2.circle(img,(450,60), 60, (0,0,255), -1); pass
cv2.ellipse(img,(256,256),(100,50),0,0,360,255,-1); pass
pts = np.array([[10,450],[100,300],[200,420],[10,450]], np.int32)
pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255,255)); pass
最后查看一下结果 :
plt.imshow(img)
plt.show()
这里 reshape 的第一个参数为 -1, 表明这一维的长度是根据后面的维度的计算出来的。 如果第三个参数是 False,得到的多边形是不闭合的(首尾不相连)。
注意:cv2.polylines()
可以被用来画很多条线。只需要把想要画的线放在一个列表中,
将这个列表传给函数就可以了。每条线都会被独立绘制。
这会比用 cv2.line()
一条一条的绘制要快一些。
添加水印
要在图片上绘制文字,需要设置下列参数:
绘制的文字
绘制的位置
字体类型(通过查看
cv2.putText()
的文档找到支持的字体)字体的大小
文字的一般属性如颜色,粗细,线条的类型等。为了更好看一点推荐使用
linetype=cv2.LINE_AA
。
img=cv2.imread('/data/demo/L1020120.JPG')
img.shape
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img,'OpenCV',(500,600), font, 4,(25,205,255),7,cv2.LINE_AA)
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)
plt.show()
- (2000,1900) 设置字体位置
- (font, 7) 调整字体大小
- (25,205,255) 调整字体颜色
- (10) 调整字体粗细
形态学处理
形态学一词通常指生物学的一个分支,它用于处理动物和植物的形状和结构。 在数学形态学的语境中也使用该词来作为提取图像分量的一种工具, 这些分量在表示和描述区域形状(如边界,骨骼和凸壳)时是很有用的。此外, 还很关注用于预处理和后处理的形态学技术,如形态学滤波、细化和裁剪。 数学形态学的基本运算 数学形态学的基本运算有4个:腐蚀、膨胀、开启和闭合。 数学形态学方法利用一个称作结构元素的”探针”收集图像的信息,当探针在图像中不断移动时, 便可考察图像各个部分之间的相互关系,从而了解图像的结构特征。 在连续空间中,灰度图像的腐蚀、膨胀、开启和闭合运算分别表述如下。
腐蚀
腐蚀“收缩”或“细化”二值图像中的对象。收缩的方式和程度由一个结构元素控制。 数学上,A被B腐蚀,记为AΘB, 换言之,A被B腐蚀是所有结构元素的原点位置的集合,其中平移的B与A的背景并不叠加。 可以理解为腐蚀是将黑色区域放大。
image = cv2.imread("/data/demo/i.png")
plt.imshow(image)
plt.show()
kernel = np.ones((5,5),np.uint8)
erosion = cv2.erode(image,kernel,iterations = 1)
plt.imshow(erosion)
plt.xticks([]), plt.yticks([])
plt.show()
卷积值越大,处理的图像越明显。
kernel = np.ones((10,10),np.uint8)
erosion = cv2.erode(image,kernel,iterations = 1)
plt.imshow(erosion)
plt.xticks([]), plt.yticks([])
plt.show()
膨胀
膨胀是在二值图像中“加长”或“变粗”的操作。这种特殊的方式和变粗的程度由一个称为结构元素的集合控制。 结构元素通常用0和1的矩阵表示。数学上,膨胀定义为集合运算。A被B膨胀, 记为A⊕B,与腐蚀相反膨胀是将白色的区域方大。
其中,Φ为空集,B为结构元素。总之,A被B膨胀是所有结构元素原点位置组成的集合, 其中映射并平移后的B至少与A的某些部分重叠。这种在膨胀过程中对结构元素的平移类似于空间卷积。
膨胀满足交换律,即A⊕B=B⊕A。在图像处理中,习惯令A⊕B的第一个操作数为图像, 而第二个操作数为结构元素,结构元素往往比图像小得多。 膨胀满足结合律,即A⊕(B⊕C)=(A⊕B)⊕C。假设一个结构元素B可以表示为两个结构元素B1和B2的膨胀, 即B=B1⊕B2,则A⊕B=A⊕(B1⊕B2)=(A⊕B1)⊕B2,换言之,用B膨胀A等同于用B1先膨胀A, 再用B2膨胀前面的结果。因此称B能够分解成B1和B2两个结构元素。结合律很重要, 因为计算膨胀所需要的时间正比于结构元素中的非零像素的个数。通过结合律,分解结构元素, 再分别用子结构元素进行膨胀操作往往会实现很客观的速度的增长。
image = cv2.imread("/data/demo/i.png")
plt.imshow(image)
plt.show()
kernel = np.ones((5,5),np.uint8)
dilation = cv2.dilate(image,kernel,iterations = 1)
plt.imshow(dilation)
plt.xticks([]), plt.yticks([])
plt.show()
img=cv2.imread("/data/demo/img7.png")
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
plt.subplot(121),plt.imshow(img),plt.title('Original')
plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(opening),plt.title('Opening')
plt.xticks([]), plt.yticks([])
plt.show()
img=cv2.imread("/data/demo/img5.png")
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)
plt.subplot(121),plt.imshow(img),plt.title("Original")
plt.xticks([]),plt.yticks([])
plt.subplot(122),plt.imshow(closing),plt.title("Closing")
plt.xticks([]),plt.yticks([])
plt.show()