统计一副彩色图片中多个不连续ROI区域中像素点的个数,其中:
由于ROI区域不规则,不能给出坐标位置,仅仅知道该区域在图片中的位置,需要在原图中手动绘制几个ROI区域,然后统计该区域像素点的个数。(和图像的通道数量没有关系,无论什么图像都会把图像转为单通道)
import cv2
import numpy as np
# 初始化列表
drawing = False
roi_pts = []
# 创建回调函数以处理鼠标事件
def select_roi(event, x, y, flags, param):
global roi_pts, drawing
# 开始绘制
if event == cv2.EVENT_LBUTTONDOWN:
drawing = True
roi_pts = [(x, y)]
# 鼠标移动,添加中间点
elif event == cv2.EVENT_MOUSEMOVE:
if drawing:
roi_pts.append((x, y))
img_temp = img_copy.copy()
cv2.polylines(img_temp, [np.array(roi_pts)], isClosed=False, color=(0, 255, 0), thickness=1)
cv2.imshow('image', img_temp)
# 结束绘制并统计像素数量
elif event == cv2.EVENT_LBUTTONUP:
drawing = False
cv2.polylines(img_copy, [np.array(roi_pts)], isClosed=True, color=(0, 255, 0), thickness=2)
mask = np.zeros_like(img)
cv2.fillPoly(mask, pts=[np.array(roi_pts)], color=(255, 255, 255))
roi = cv2.bitwise_and(img_copy, mask)
count = cv2.countNonZero(cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY))
print(f'ROI pixel count: {count}')
cv2.imshow('image', img_copy)
# 加载图片
image_path = 'detect1.jpg' # 替换为你的图片路径
img = cv2.imread(image_path)
img_copy = img.copy()
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('image', select_roi)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()