使用 OpenCV 进行白点和黑点检测 | Python
使用Python进行图像处理是当今世界最热门的话题之一。但是图像处理有点复杂,初学者对第一种方法感到厌烦。所以在本文中,我们有一个非常基本的图像处理Python程序,可以使用 OpenCV 函数( cv2.imread, cv2.threshold, cv2.findContours, cv2.contourArea
)计算白色表面中的黑点和黑色表面中的白点。
数一数白色表面上的黑点——
首先我们需要导入 OpenCV 库。所有关于图像处理的函数都驻留在这个库中。为了存储图像的路径,我们将在变量路径中进行处理。
import cv2
# path ="C:/Users/Personal/Downloads/black dot.jpg"
path ="black dot.jpg"
输入图像 -
以灰度模式加载图像。通过灰度模式,图像被转换为由灰度阴影组成的黑白图像。
gray = cv2.imread(path, 0)
函数cv2.threshold
的作用是,如果像素值大于阈值,则为其分配一个值(可能为白色),否则为其分配另一个值(可能为黑色)。第一个参数是源图像,它应该是灰度图像(之前完成)。第二个参数是用于对像素值进行分类的阈值。对于阈值,只需传递零。然后算法找到最佳阈值并将您作为第二个输出 th 返回。如果不使用 Otsu 阈值,则 th 与您使用的阈值相同。
# threshold
th, threshed = cv2.threshold(gray, 100, 255,
cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)
轮廓可以简单地解释为连接所有连续点(沿边界)的曲线,具有相同的颜色或强度。轮廓是形状分析和对象检测和识别的有用工具。轮廓为使用二值图像提供了更好的准确性。 cv2.findContours()
函数中有三个参数,第一个是源图像,第二个是轮廓检索模式,第三个是轮廓逼近方法。它输出轮廓和层次结构。 Contours 是图像中所有轮廓的Python列表。每个单独的轮廓都是对象边界点的 (x, y) 坐标的 Numpy 数组。
它主要连接图像的黑点来计数——
# findcontours
cnts = cv2.findContours(threshed, cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)[-2]
cv2.contourArea()
可以计算物体的轮廓面积。这里的对象是黑点。当它得到一个黑点时,它会计算面积,如果它满足最小面积作为一个点的条件,那么它将把它的面积值推到列表xcnts中。
# filter by area
s1 = 3
s2 = 20
xcnts = []
for cnt in cnts:
if s1
最后,我们不需要这些区域。如果它被认为是一个点,那么它的区域包含在列表 xcnts 中。因此,如果我们计算列表的长度,我们将得到点的数量。
print("\nDots number: {}".format(len(xcnts)))
输出 :
23
数一数黑色背景上的白点——
现在为了计算白点,我们需要稍微改变阈值。我们必须使用 c v2.THRESH_BINARY
而不是cv2.THRESH_BINARY_INV
因为我们正在计算黑色表面上的白色值。其他过程相同。我们可以更改s1和s2值以检查最佳结果。
输入图像:
import cv2
path ="white dot.png"
# reading the image in grayscale mode
gray = cv2.imread(path, 0)
# threshold
th, threshed = cv2.threshold(gray, 100, 255,
cv2.THRESH_BINARY|cv2.THRESH_OTSU)
# findcontours
cnts = cv2.findContours(threshed, cv2.RETR_LIST,
cv2.CHAIN_APPROX_SIMPLE)[-2]
# filter by area
s1 = 3
s2 = 20
xcnts = []
for cnt in cnts:
if s1
输出 :
583
参考:
https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_thresholding/py_thresholding.html
https://docs.opencv.org/3.1.0/d4/d73/tutorial_py_contours_begin.html
在评论中写代码?请使用 ide.geeksforgeeks.org,生成链接并在此处分享链接。