2026/5/21 13:23:12
网站建设
项目流程
大型网站制作丹阳网站建设,环球网站建设,三明购物网站开发设计,phpcms v9网站性能优化本次项目的核心目标有两个#xff1a;
一是从郁金香图像中精准提取出整束花的外部原始轮廓#xff0c;排除图像中的背景杂质与无关干扰#xff1b;
二是通过多边形逼近算法对原始轮廓进行简化#xff0c;得到平滑的近似轮廓#xff0c;同时保留郁金香的核心形状特征。
…本次项目的核心目标有两个一是从郁金香图像中精准提取出整束花的外部原始轮廓排除图像中的背景杂质与无关干扰二是通过多边形逼近算法对原始轮廓进行简化得到平滑的近似轮廓同时保留郁金香的核心形状特征。代码如下1. 读取图像并预处理 img cv2.imread(rC:\Users\LEGION\Desktop\fb312a897160f2c9036096f52dbdecf6.png) # 转换为灰度图像 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理针对白色背景郁金香阈值240提升轮廓提取精度 _, thresh cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV) # 2. 提取外部轮廓OpenCV 3.x专属返回3个值下划线忽略无用的处理后图像 _, contours, hierarchy cv2.findContours( thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) if len(contours) 0: raise ValueError(未检测到图像轮廓请调整二值化阈值或检查图像质量) # 选取面积最大的轮廓确保是整束花的外部轮廓排除杂质小轮廓 target_contour max(contours, keycv2.contourArea) # 3. 计算近似轮廓ε周长×0.005符合题目要求 contour_perimeter cv2.arcLength(target_contour, closedTrue) epsilon 0.005 * contour_perimeter approx_contour cv2.approxPolyDP(target_contour, epsilon, closedTrue) # 4. 核心创建两个独立图像副本分别绘制单一轮廓避免叠加实现分开输出 # 副本1仅绘制红色原始外部轮廓 img_red_original img.copy() cv2.drawContours( img_red_original, [target_contour], 0, (0, 0, 255), # OpenCV BGR格式红色 2 # 线宽 ) # 副本2仅绘制绿色近似轮廓 img_green_approx img.copy() cv2.drawContours( img_green_approx, [approx_contour], 0, (0, 255, 0), # OpenCV BGR格式绿色 2 # 线宽 ) # 5. 分开显示两个独立窗口展示结果可视化查看 # 窗口1红色原始轮廓 cv2.namedWindow(Result 1: Red Original Contour, cv2.WINDOW_NORMAL) cv2.imshow(Result 1: Red Original Contour, img_red_original) # 窗口2绿色近似轮廓 cv2.namedWindow(Result 2: Green Approx Contour, cv2.WINDOW_NORMAL) cv2.imshow(Result 2: Green Approx Contour, img_green_approx) # 6. 分开保存两个独立文件持久化存储可长期查看保存在代码同级目录 cv2.imwrite(flower_red_original_contour.png, img_red_original) cv2.imwrite(flower_green_approx_contour.png, img_green_approx) # 打印保存提示 print(分开保存完成文件路径) print(1. 红色原始轮廓flower_red_original_contour.png) print(2. 绿色近似轮廓flower_green_approx_contour.png) # 等待按键输入后关闭所有显示窗口 cv2.waitKey(0) cv2.destroyAllWindows()注释二值化处理二值化处理是将灰度图像转换为只有黑色和白色两种像素值的图像这样能够突出目标物体与背景的边界方便后续轮廓提取。我们使用cv2.threshold()函数进行二值化处理该函数有四个核心参数第一个参数待二值化的灰度图像gray第二个参数阈值240本次实战中郁金香图像的背景是白色像素值接近 255郁金香本身的像素值低于 240因此选择 240 作为阈值能够很好地区分郁金香和背景第三个参数最大值255当像素值超过阈值或低于阈值取决于二值化类型时将其设置为该最大值第四个参数二值化类型cv2.THRESH_BINARY_INV表示反向二值化即像素值低于阈值的设置为 255白色高于阈值的设置为 0黑色。这样处理后郁金香会变成白色背景会变成黑色更符合 OpenCV 轮廓提取的要求。cv2.findContours()函数有三个核心参数第一个参数二值化图像thresh第二个参数轮廓检索模式cv2.RETR_EXTERNAL表示只提取最外层的轮廓忽略内部的子轮廓这正是我们需要的郁金香外部轮廓第三个参数轮廓逼近方法cv2.CHAIN_APPROX_SIMPLE表示压缩轮廓点只保留轮廓的关键点如直线的端点、曲线的拐点能够大幅减少轮廓点的数量节省内存空间。运行结果红色的为原始轮廓绿色的为近似轮廓将两个图像的结果放在成同一张图上代码如下郁金香图像的轮廓提取、轮廓近似多边形逼近- 结果合并在同一张图中 import cv2 # 1. 读取图像并预处理 img cv2.imread(rC:\Users\LEGION\Desktop\fb312a897160f2c9036096f52dbdecf6.png) # 转换为灰度图像 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化处理针对白色背景郁金香阈值240提升轮廓提取精度 _, thresh cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV) # 2. 提取外部轮廓OpenCV 3.x专属返回3个值下划线忽略无用的处理后图像 _, contours, hierarchy cv2.findContours( thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE ) if len(contours) 0: raise ValueError(未检测到图像轮廓请调整二值化阈值或检查图像质量) # 选取面积最大的轮廓确保是整束花的外部轮廓排除杂质小轮廓 target_contour max(contours, keycv2.contourArea) # 3. 计算近似轮廓ε周长×0.005符合题目要求 contour_perimeter cv2.arcLength(target_contour, closedTrue) epsilon 0.005 * contour_perimeter approx_contour cv2.approxPolyDP(target_contour, epsilon, closedTrue) # 4. 核心创建单个图像副本在同一张图上绘制两种轮廓红色原始绿色近似 img_combined img.copy() # 仅创建一个图像副本用于合并两种轮廓 # 先绘制红色原始外部轮廓 cv2.drawContours( img_combined, [target_contour], 0, (0, 0, 255), # OpenCV BGR格式红色 2 # 线宽 ) # 再绘制绿色近似轮廓在同一个副本上叠加绘制 cv2.drawContours( img_combined, [approx_contour], 0, (0, 255, 0), # OpenCV BGR格式绿色 2 # 线宽 ) # 5. 可视化展示单个窗口展示合并结果 cv2.namedWindow(Result: Red Original Contour Green Approx Contour, cv2.WINDOW_NORMAL) cv2.imshow(Result: Red Original Contour Green Approx Contour, img_combined) # 6. 保存结果单个文件保存合并后的图像 cv2.imwrite(flower_combined_contours.png, img_combined) # 打印保存提示 print(合并结果保存完成文件路径) print(合并轮廓图像flower_combined_contours.png) # 等待按键输入后关闭所有显示窗口 cv2.waitKey(0) cv2.destroyAllWindows()轮廓叠加绘制在img_combined上先调用cv2.drawContours()绘制红色原始轮廓再调用一次该函数绘制绿色近似轮廓OpenCV 会自动将两种轮廓叠加在同一张图上红色和绿色对比清晰能直观看到轮廓近似的简化效果。运行结果