使用OpenCV计算图像中黑色到白色像素的数量

3

我是Python的新手,非常感谢任何帮助。

enter image description here

我想从这张图片中计算黑色像素点(0,0,0)和连续值,例如(1,1,1), (2,2,2), (3,3,3)一直到(255,255,255)的数量。因此,代码将打印出答案,如下:

(0,0,0) = 10 pixels
(1,1,1) = 5 pixels
(2,2,2) = 8 pixels
etc.

这是我在网上找到的一段代码,用于查找蓝色像素,但我不想设置上限和下限。我完全不知道如何做,请帮忙!

import cv2
import numpy as np

img = cv2.imread("multi.png")
BLUE_MIN = np.array([0, 0, 200], np.uint8)
BLUE_MAX = np.array([50, 50, 255], np.uint8)

dst = cv2.inRange(img, BLUE_MIN, BLUE_MAX)
no_blue = cv2.countNonZero(dst)
print('The number of blue pixels is: ' + str(no_blue))
cv2.namedWindow("opencv")
cv2.imshow("opencv",img)
cv2.waitKey(0)
3个回答

2
colors, counts = np.unique(img.reshape(-1, 3), axis=0, return_counts=True)

for color, count in zip(colors, counts):
    print("{} = {} pixels".format(color, count))

[1 1 0] = 6977 pixels
[3 3 3] = 7477 pixels
[6 6 6] = 5343 pixels
[8 8 8] = 4790 pixels
[11 11 11] = 4290 pixels
[13 13 13] = 3681 pixels
[16 16 16] = 3605 pixels
[19 19 19] = 2742 pixels
[21 21 21] = 2984 pixels
[...]

哎呀,我忘记了他们更新了np.unique并添加了一个axis参数,所以你不再需要使用void视图hack了。 - Daniel F
@DanielF 这个技巧看起来还不错,我之前不知道!不确定现在是否仍然需要它,因为大多数 np 函数现在都有一个 axis 参数。 - filippo

1
import cv2
import numpy as np
from collections import defaultdict

img = cv2.imread("C:\\temp\\multi.png")
pixels = img.reshape(-1,3)

counts = defaultdict(int)
for pixel in pixels:
    if pixel[0] == pixel[1] == pixel[2]:
        counts[pixel[0]] += 1

for pv in sorted(counts.keys()):
    print("(%d,%d,%d): %d pixels" % (pv, pv, pv, counts[pv]))

输出:

(3,3,3):7477像素
(6,6,6):5343像素
(8,8,8):4790像素
(11,11,11):4290像素
(13,13,13):3681像素
(16,16,16):3605像素
(19,19,19):2742像素
(21,21,21):2984像素
(26,26,26):2366像素
(29,29,29):2149像素
(32,32,32):2460像素
...

0

使用 void 视图和 np.unique

def vview(a):  #based on @jaime's answer: https://dev59.com/mmQn5IYBdhLWcg3wRVRs#16973510
    return np.ascontiguousarray(a).view(np.dtype((np.void, a.dtype.itemsize * a.shape[1])))

pixels = = img.reshape(-1,3)
_, idx, count = np.unique(vview(pixels), return_index = True, return_counts = True)

print np.c_[pixels[idx], count[:, None]]

基本上,pixels[idx] 是所有唯一像素的数组,而 count 则是图像中每个像素存在的数量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接