一,实验原理
通过读取图像、转换到HSV颜色空间、设置颜色阈值、去噪、形态学处理、轮廓检测并筛选合适面积的轮廓,最终绘制并显示处理后的图像。
二,实验代码
import cv2
import numpy as np
# 读取图像文件
img = cv2.imread('8.png')
img = cv2.resize(img, (0, 0), fx=0.7, fy=0.7)
# 将图像从BGR空间转换为HSV空间
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 设置颜色检测的阈值,这里是在HSV空间内寻找黄色
hsv_min = np.array([26, 43, 46])
hsv_max = np.array([34, 255, 255])
# 查找在定义的颜色范围内的像素
img_mask_y = cv2.inRange(img_hsv, hsv_min, hsv_max)
# 使用中值滤波器进行图像滤波,删除图像中的噪声点
img_median_blur = cv2.medianBlur(img_mask_y, 3)
# 执行自适应阈值处理,得到二值化图像
img_binary = cv2.adaptiveThreshold(img_mask_y, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 7, 5)
# 定义一个3x3的椭圆形的结构元素,用于图像形态学操作的腐蚀和膨胀
kernal = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3, 3))
# 腐蚀操作
img_erode = cv2.erode(img_binary, kernal)
# 膨胀操作,恢复原有的图像形状
img_erode_dilate = cv2.dilate(img_erode, kernal)
# 使用Otsu's二值化方法,将图像分割为黑白两部分
_, img_bin = cv2.threshold(img_erode_dilate, 127, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 查找并返回图像中的轮廓
contours, hierarchy = cv2.findContours(img_bin, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# 在原图上画出查找到的轮廓
img_copy = img.copy()
for cnt in contours:
area = cv2.contourArea(cnt)
# 过滤掉面积过小或过大的轮廓
if area < 50000 or area > 20000000:
continue
cv2.drawContours(img_copy, [cnt], 0, (0, 0, 255), 3)
# 显示处理后的图像
cv2.imshow('img', img_copy)
cv2.waitKey(0)
三,实验现象
标出目标轮廓,2个黄色大圆