如何在OpenCV Python中使用bitwise运算符检测绿色区域像素质量?
用Bitwise运算符实现绿色区域像素统计
实现思路
原本通过cv2.inRange生成颜色掩码、cv2.countNonZero统计像素的流程,可完全通过Bitwise运算符拆解为以下步骤:
- 将图像转换为HSV色彩空间(更易精准筛选绿色)
- 对H、S、V三个通道分别生成符合绿色范围的单通道掩码
- 用Bitwise与操作合并三个通道的掩码,得到最终绿色区域掩码
- 用Bitwise与操作配合求和,统计掩码中的非零像素数量
完整代码示例
import cv2 import numpy as np # 读取图像并转换为HSV色彩空间 img = cv2.imread('target_image.jpg') hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 定义绿色的HSV范围(可根据实际场景调整) low_h, high_h = 40, 70 low_s, high_s = 40, 255 low_v, high_v = 40, 255 # 生成各通道的范围掩码:先通过比较得到布尔数组,转为uint8格式的255/0,再用bitwise_and取交集 mask_h = cv2.bitwise_and( (hsv_img[:, :, 0] >= low_h).astype(np.uint8) * 255, (hsv_img[:, :, 0] <= high_h).astype(np.uint8) * 255 ) mask_s = cv2.bitwise_and( (hsv_img[:, :, 1] >= low_s).astype(np.uint8) * 255, (hsv_img[:, :, 1] <= high_s).astype(np.uint8) * 255 ) mask_v = cv2.bitwise_and( (hsv_img[:, :, 2] >= low_v).astype(np.uint8) * 255, (hsv_img[:, :, 2] <= high_v).astype(np.uint8) * 255 ) # 合并三个通道的掩码:只有同时满足三个通道范围的像素才会被保留 mask_hs = cv2.bitwise_and(mask_h, mask_s) final_green_mask = cv2.bitwise_and(mask_hs, mask_v) # 用Bitwise操作统计非零像素数:将掩码与全1矩阵做与操作,再求和后除以255(掩码非零值为255) ones_matrix = np.ones_like(final_green_mask, dtype=np.uint8) count_matrix = cv2.bitwise_and(final_green_mask, ones_matrix) green_pixel_count = np.sum(count_matrix) // 255 print(f"绿色区域像素总数:{green_pixel_count}")
关键步骤说明
- 通道掩码生成:
cv2.inRange本质是对每个通道做范围判断后取逻辑与,这里我们用bitwise_and替代逻辑与操作,手动实现每个通道的范围筛选。 - 掩码合并:通过多次
bitwise_and操作,确保只有同时满足H、S、V三个通道范围的像素才会被标记为绿色区域。 - 像素统计:用
bitwise_and将掩码中的255(非零值)转换为1,再通过求和得到像素数量,完全替代cv2.countNonZero的功能。
内容的提问来源于stack exchange,提问作者Jasgunh Singh
相关产品推荐
相关产品推荐

