pythonimport cv2import numpy as npimport matplotlib.pyplot as plt# 1. 环境验证(可选)print("OpenCV版本:", cv2.__version__)# 2. 读取图像(灰度图+彩色图)img_gray = cv2.imread("test.jpg", 0) # 替换为自己的图像路径img_color = cv2.imread("test.jpg")img_color_rgb = cv2.cvtColor(img_color, cv2.COLOR_BGR2RGB)img_hsv = cv2.cvtColor(img_color, cv2.COLOR_BGR2HSV)# 3. 直方图查找与绘制## 3.1 灰度图直方图hist_gray = cv2.calcHist([img_gray], [0], None, [256], [0, 256])## 3.2 彩色图三通道直方图hist_b = cv2.calcHist([img_color], [0], None, [256], [0, 256])hist_g = cv2.calcHist([img_color], [1], None, [256], [0, 256])hist_r = cv2.calcHist([img_color], [2], None, [256], [0, 256])# 4. 直方图均衡## 4.1 灰度图均衡img_gray_eq = cv2.equalizeHist(img_gray)hist_gray_eq = cv2.calcHist([img_gray_eq], [0], None, [256], [0, 256])## 4.2 彩色图均衡(HSV格式)img_hsv_eq = img_hsv.copy()img_hsv_eq[:, :, 2] = cv2.equalizeHist(img_hsv_eq[:, :, 2])img_color_eq = cv2.cvtColor(img_hsv_eq, cv2.COLOR_HSV2BGR)img_color_eq_rgb = cv2.cvtColor(img_color_eq, cv2.COLOR_BGR2RGB)# 5. 2D直方图(H-S通道)hist_2d = cv2.calcHist([img_hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])# 6. 直方图反投影(目标定位)## 6.1 截取目标模板(可根据自己的图像调整坐标)x1, y1, x2, y2 = 50, 50, 150, 150template = img_hsv[y1:y2, x1:x2]## 6.2 模板直方图与归一化hist_template = cv2.calcHist([template], [0, 1], None, [180, 256], [0, 180, 0, 256])cv2.normalize(hist_template, hist_template, 0, 255, cv2.NORM_MINMAX)## 6.3 反投影与形态学优化back_project = cv2.calcBackProject([img_hsv], [0, 1], hist_template, [0, 180, 0, 256], 1)kernel = np.ones((5, 5), np.uint8)back_project = cv2.erode(back_project, kernel, iterations=1)back_project = cv2.dilate(back_project, kernel, iterations=1)## 6.4 目标定位与标注img_result = img_color.copy()contours, _ = cv2.findContours(back_project, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)if contours:x, y, w, h = cv2.boundingRect(contours[0])cv2.rectangle(img_result, (x, y), (x+w, y+h), (0, 0, 255), 2)cv2.putText(img_result, "Target", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)img_result_rgb = cv2.cvtColor(img_result, cv2.COLOR_BGR2RGB)# 7. 统一显示所有效果plt.figure(figsize=(16, 12))# 直方图查找与绘制plt.subplot(3, 4, 1)plt.imshow(img_gray, cmap="gray")plt.title("原始灰度图")plt.axis("off")plt.subplot(3, 4, 2)plt.plot(hist_gray, color="black")plt.title("灰度直方图")plt.xlim([0, 256])plt.subplot(3, 4, 3)plt.imshow(img_color_rgb)plt.title("原始彩色图")plt.axis("off")plt.subplot(3, 4, 4)plt.plot(hist_b, color="blue", label="B")plt.plot(hist_g, color="green", label="G")plt.plot(hist_r, color="red", label="R")plt.title("彩色图直方图")plt.xlim([0, 256])plt.legend()# 直方图均衡plt.subplot(3, 4, 5)plt.imshow(img_gray_eq, cmap="gray")plt.title("灰度图均衡后")plt.axis("off")plt.subplot(3, 4, 6)plt.plot(hist_gray_eq, color="red")plt.title("均衡后灰度直方图")plt.xlim([0, 256])plt.subplot(3, 4, 7)plt.imshow(img_color_eq_rgb)plt.title("彩色图均衡后")plt.axis("off")plt.subplot(3, 4, 8)plt.imshow(cv2.resize(hist_2d, (400, 300)), interpolation="nearest", cmap="jet")plt.title("2D直方图(H-S)")plt.colorbar(label="像素数量", shrink=0.8)# 直方图反投影plt.subplot(3, 4, 9)plt.imshow(cv2.cvtColor(template, cv2.COLOR_HSV2RGB))plt.title("目标模板")plt.axis("off")plt.subplot(3, 4, 10)plt.imshow(back_project, cmap="gray")plt.title("反投影图像")plt.axis("off")plt.subplot(3, 4, 11)plt.imshow(img_result_rgb)plt.title("目标定位结果")plt.axis("off")plt.subplot(3, 4, 12)plt.axis("off") # 占位,使布局整齐plt.tight_layout()plt.show()# 8. 保存结果(可选)cv2.imwrite("gray_eq.jpg", img_gray_eq)cv2.imwrite("color_eq.jpg", img_color_eq)cv2.imwrite("back_project.jpg", back_project)cv2.imwrite("target_result.jpg", img_result) |