📜  使用 OpenCV 进行白点和黑点检测 | Python

📅  最后修改于: 2022-05-13 01:54:52.261000             🧑  作者: Mango

使用 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因为我们正在计算黑色表面上的白色值。其他过程相同。我们可以更改s1s2值以检查最佳结果。

输入图像:

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