opencv二级化后像素值全成了255

我是初学者,想统计一张图片里虫子的数量

思路是先灰度化,再二级化,最后进行连通性分析,统计数量

这是图片

img


下面是代码

import cv2
import matplotlib.pyplot as plt

image = cv2.imread("work/shrimps.jpg")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) #灰度化
ret,thresh = cv2.threshold(gray, 0, 255,
    cv.THRESH_OTSU)   #大津算法  二值化
retval, labels, stats, centroids = cv2.connectedComponentsWithStats(thresh, connectivity=8)
#retval : 返回值是连通区域的数量。
#labels : labels是一个与image一样大小的矩形(labels.shape = image.shape),其中每一个连通区域会有一个唯一标识,标识从0开始。
#stats :stats会包含5个参数分别为x,y,h,w,s。分别对应每一个连通区域的外接矩形的起始坐标x,y;外接矩形的wide,height;s其实不是外接矩形的面积,实践证明是labels对应的连通区域的像素个数。
#centroids : 返回的是连通区域的质心。
print(thresh)
print(retval)
print(labels)
print(stats)

下面是输出

[[255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 ...
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]
 [255 255 255 ... 255 255 255]]
2
[[1 1 1 ... 1 1 1]
 [1 1 1 ... 1 1 1]
 [1 1 1 ... 1 1 1]
 ...
 [1 1 1 ... 1 1 1]
 [1 1 1 ... 1 1 1]
 [1 1 1 ... 1 1 1]]
[[     0      0   1021    720  10092]
 [     0      0   1024    720 727188]]

想问一下这是什么问题,为什么二级化后像素值全成了255

使用如下语句,显示数组全部数据后你就可以看到,并不全是255,
import numpy as np
np.set_printoptions(threshold=np.inf)
使用print(np.count_nonzero(thresh==0))得出值为0 的个数为1417个(黑色像素值)

如对你有帮助,请点击我回答右上方采纳按钮采纳支持一下。

threshold的参数不对

opencv图像显示用print显然不直观,用imshow显示一下。可视化看是黑的白的。

cv2.namedWindow("thresh",0)
cv2.imshow("thresh", thresh)
cv2.waitKey(20)