NEWS DETAIL

【深度学习】OpenCV 实战:从图片中精确提取扇子区域

发布时间:2026/10/25 5:00:16 · 栏目:资讯中心

尧图网络原创建站知识分享正文
文章目录完整代码一览导入库与辅助函数定义显示图像函数cv_show辅助轮廓排序函数 sort_contours主程序流程读取图片缩放并逆时针旋转90度Canny 边缘检测查找轮廓筛选扇子外轮廓生成掩膜按位与操作提取扇子区域保存结果一个完整的图像提取流程读取图片 → 缩放 旋转 → Canny 边缘检测 → 查找轮廓 → 生成掩膜 → 按位与提取目标区域。项目要求一张名为fan.jpg的图片现要求使用 Python 结合 OpenCV 库编写代码实现以下功能1读取名为fan.jpg的图片将尺寸设置为宽640高480然后逆时针旋转90度2使用Canny边缘检测提取1处理后的边缘3在提取边缘的基础上查找轮廓并选取扇子的外轮廓生成相应的掩模4将步骤 1 处理后的图像与步骤 3 生成的掩模执行按位与操作提取扇子区域图像最终将结果保存为shanzi.png文件。样图fan.jpy完整代码一览import cv2 import numpy as np defcv_show(name,image):cv2.imshow(name,image)cv2.waitKey(0)defsort_contours(cnts,methodleft-to-right):reverseFalse i0ifmethodright-to-leftor methodbottom-to-top:reverseTrueifmethodtop-to-bottomor methodbottom-to-top:i1boundingBoxes[cv2.boundingRect(c)forc in cnts](cnts,boundingBoxes)zip(*sorted(zip(cnts,boundingBoxes),keylambda b:b[1][i],reversereverse))returncnts,boundingBoxes #----------主程序----------#(1)读取图片缩放并逆时针旋转90度 imgcv2.imread(r./fan.jpg)imgcv2.resize(img,(640,480))img_1np.rot90(img,k1)# k1表示逆时针旋转90度 cv2.imshow(yuan_tu,img)cv2.imshow(fan_image,img_1)cv2.waitKey(0)cv2.destroyAllWindows()#(2)Canny边缘检测 contours_imgimg_1.copy()graycv2.cvtColor(img_1,cv2.COLOR_BGR2GRAY)blurredcv2.GaussianBlur(gray,ksize(5,5),sigmaX0)cv_show(blurred,blurred)img_cannycv2.Canny(blurred,threshold175,threshold2200)cv_show(img_canny,img_canny)#(3)查找轮廓选取扇子的外轮廓生成掩膜 cntscv2.findContours(img_canny.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]cv2.drawContours(contours_img,cnts,-1,(0,0,255),3)cv_show(contours_img,contours_img)# 排序其实这里只有一个最大的轮廓但保留排序习惯 questionCnts[]forc in cnts:x,y,w,hcv2.boundingRect(c)questionCnts.append(c)questionCntssort_contours(questionCnts,methodtop-to-bottom)[0]fan_contsquestionCnts[0]# 取第一个最大的轮廓 masknp.zeros_like(gray)cv2.drawContours(mask,[fan_conts],-1,255,thickness-1)# thickness-1填充轮廓内部cv_show(img_mask,mask)#(4)按位与操作提取扇子区域 img_mask_andcv2.bitwise_and(img_1,img_1,maskmask)cv_show(img_mask_and,img_mask_and)# 保存结果 cv2.imwrite(shanzi.png,img_mask_and)导入库与辅助函数定义显示图像函数cv_showimport cv2 import numpy as np defcv_show(name,image):cv2.imshow(name,image)cv2.waitKey(0)辅助轮廓排序函数 sort_contoursdefsort_contours(cnts,methodleft-to-right):reverseFalse i0ifmethodright-to-leftor methodbottom-to-top:reverseTrueifmethodtop-to-bottomor methodbottom-to-top:i1boundingBoxes[cv2.boundingRect(c)forc in cnts](cnts,boundingBoxes)zip(*sorted(zip(cnts,boundingBoxes),keylambda b:b[1][i],reversereverse))returncnts,boundingBoxes主程序流程读取图片缩放并逆时针旋转90度imgcv2.imread(r./fan.jpg)imgcv2.resize(img,(640,480))img_1np.rot90(img,k1)cv2.imshow(yuan_tu,img)cv2.imshow(fan_image,img_1)cv2.waitKey(0)cv2.destroyAllWindows()运行结果Canny 边缘检测contours_imgimg_1.copy()graycv2.cvtColor(img_1,cv2.COLOR_BGR2GRAY)blurredcv2.GaussianBlur(gray,ksize(5,5),sigmaX0)cv_show(blurred,blurred)img_cannycv2.Canny(blurred,threshold175,threshold2200)cv_show(img_canny,img_canny)先复制旋转后的图像用于后面绘制轮廓再转为灰度图用 5×5 的核进行平滑去除噪点避免边缘检测时出现大量假边缘。Canny 边缘检测阈值 75 和 200 是经验值可根据图片对比度调整。数值越小检测出的边缘越丰富可能包含噪声越大则只保留最强边缘。运行结果查找轮廓筛选扇子外轮廓cntscv2.findContours(img_canny.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)[-2]cv2.drawContours(contours_img,cnts,-1,(0,0,255),3)cv_show(contours_img,contours_img)运行结果这里把所有轮廓放入列表然后用排序函数按从上到下排序——实际上因为只有一个大轮廓其他小噪声轮廓面积小排序后第一个就是面积最大的扇子轮廓。questionCnts[]forc in cnts:x,y,w,hcv2.boundingRect(c)questionCnts.append(c)questionCntssort_contours(questionCnts,methodtop-to-bottom)[0]fan_contsquestionCnts[0]生成掩膜masknp.zeros_like(gray)cv2.drawContours(mask,[fan_conts],-1,255,thickness-1)cv_show(img_mask,mask)运行结果按位与操作提取扇子区域对两张图像这里都是 img_1按位与但通过 mask 参数指定只有白色区域才参与运算黑色区域结果直接为 0。这样原图中只有扇子部分被保留背景全黑完美抠出扇子。img_mask_andcv2.bitwise_and(img_1,img_1,maskmask)cv_show(img_mask_and,img_mask_and)运行结果保存结果cv2.imwrite(shanzi.png,img_mask_and)
✦

本文为尧图网络原创建站知识分享。想针对自身行业获取定制化建站方案?欢迎咨询,资深顾问免费为你出思路。

RELATED

相关 资讯推荐

MORE

更多 新鲜资讯

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析
2026/10/25 15:06:20

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析

1. 项目概述:从零开始,用JMeter搞定HTTP性能测试 刚接触性能测试的新手,或者是从功能测试转过来的朋友,一听到“压测”两个字,心里可能就有点发怵。工具那么多,概念那么杂,从哪儿下手呢&#xf…

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统
2026/10/24 20:39:51

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统

最近我用TypeScript写了一个运行在浏览器里的Web操作系统 Earendel(目前已知的距离地球最遥远的恒星)。开发它的初衷主要是为了Linux和操作系统课程的教学。市面上绝大多数Web OS项目,要么只是做了一个长得像Windows/macOS的网页UI拼盘&#…

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]
2026/10/25 8:02:16

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形🚀 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: http…

从零制作同人动画:技术路线、流程与实战避坑指南
2026/10/25 15:27:07

从零制作同人动画:技术路线、流程与实战避坑指南

1. 先搞清楚这个“粉丝动画”到底是什么,以及它能解决什么问题看到“五条悟VS宿傩/咒术回战粉丝动画”这个标题,很多人的第一反应可能是去找一个现成的视频。但如果你是一个想自己动手创作、或者想了解这类作品背后技术流程的创作者,这个标题…

闭源降价80%,开源却在涨价:AI定价的交叉路口
2026/10/24 22:16:44

闭源降价80%,开源却在涨价:AI定价的交叉路口

8月6日,两条价格曲线悄然交汇。 一条向下:OpenAI把GPT-5.6 Luna的输出价格从6美元砍到1.2美元/百万Token,降幅80%。另一条向上:同一天,DeepSeek公告全线涨价,措辞是"涨幅较大",非试探…

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买
2026/10/25 8:02:07

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买经常有工厂朋友拿着网上的"三防平板十大品牌排行榜"来问我:到底选哪个?说实话排行榜看看就行,真正选型得看你产线什么场景。今天挑五个在产线数字化里用得比较多的品牌—…

看完这篇,还想了解更多?

预约尧图网络顾问一对一沟通,针对你的行业与现状给出建站建议,全程免费。

免费咨询