首页 > 解决方案 > 如何检测指定 x,y 位置的白色像素

问题描述

我有一个图像,我使用给定的 x,y 坐标在 OpenCV 中进行屏蔽和裁剪。我还尝试检测并显示所述图像中的白色像素,这要归功于我在另一篇 Stackoverflow 帖子中得到的答案的帮助。

我目前有以下内容:

import numpy as np
import cv2

img = cv2.imread('Image.jpg')
#img = cv2.imread('Image2.jpg') 
#img = cv2.imread('Image3.jpg')

mask = np.zeros(img.shape[:2], np.uint8)

bgdModel = np.zeros((1, 65), np.float64)
fgdModel = np.zeros((1, 65), np.float64)

rect = (1512, 20, 180, 185) # boundary of interest
cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 5, cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8')
img = img * mask2[:, :, np.newaxis]
cv2.imwrite('Image_mask.jpg', img)

# x,y coordinates for specified "fixed" location
mx = (1510, 22, 110, 185)
x, y, h, w = mx

# Output to files
crop = img[y:y+h, x:x+w]
cv2.imwrite('Image_crop.jpg', crop)

cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imwrite('Image_cont.jpg', img)

# Detect white pixels from cropped image
img = cv2.imread('Image_crop.jpg')
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,gray = cv2.threshold(gray, 150,255,0)
gray2 = gray.copy()

cv2.imshow('IMG',gray2)

cv2.waitKey(0)
cv2.destroyAllWindows()

输出:

输出

理想情况下,我现在想做的是尝试查看位置(对象周围的 20x20 正方形)是否有白色像素,然后打印出来。我将如何去做这件事。

我是否必须根据我得到的裁剪再次手动选择 x,y 坐标,然后检测白色像素,如果可以,是否可以同时使用两个不同的坐标进行操作,或者是否有更简单的方法?

标签: pythonopencv

解决方案


您可以对正方形内的像素值求和,如果数字高于某个阈值,则存在非黑色像素。如果您绝对确定背景是全黑的,那么您可以检查像素值总和是否非零,以断言您正在评估的区域中有白色像素。

crop = img[y:y+h, x:x+w]
if crop.sum() > 0:
    print("White pixels detected")

或使用 numpy:

np.sum(crop)

推荐阅读