python – Hough线变换以在图像中查找多边形
发布时间:2020-12-20 13:50:55 所属栏目:Python 来源:网络整理
导读:我想在下面的图像中找到所有多边形(包括填充的多边形).目前,我正在尝试使用 Hough Transform来完成此任务,但它没有检测到图像中的所有行.此外,由于线条的宽度,它每行计算两次.有没有办法对图像应用一些滤镜以使Hough变换表现更好,或者是否有完全不同的方法来
我想在下面的图像中找到所有多边形(包括填充的多边形).目前,我正在尝试使用
Hough Transform来完成此任务,但它没有检测到图像中的所有行.此外,由于线条的宽度,它每行计算两次.有没有办法对图像应用一些滤镜以使Hough变换表现更好,或者是否有完全不同的方法来找到我缺少的多边形?谢谢!
这是我正在处理的图片, 我的代码如下. import cv2 import numpy as np img = cv2.imread('test.png') gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray,50,150,apertureSize = 3) minLineLength = 100 maxLineGap = 10 lines = cv2.HoughLinesP(edges,1,np.pi/180,100,minLineLength,maxLineGap) for num in range (0,len(lines)): for x1,y1,x2,y2 in lines[num]: cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2) cv2.imwrite('houghlines.jpg',img) 解决方法
我认为使用findContours更容易解决这个问题.
以下是解决方案,我写下评论,如果您有任何疑问,请询问. void detect_by_contour() { //Following comments are written for non c++ programmers auto img = cv::imread("../forum_quest/data/yd8pA.png"); if(img.empty()){ throw std::runtime_error("cannot open image"); } cv::Mat gray_img; cv::cvtColor(img,gray_img,CV_BGR2GRAY); cv::Mat thin_img; //make your lines as thin as possible morphology_skeleton(gray_img,thin_img); std::vector<std::vector<cv::Point>> contours; cv::findContours(thin_img,contours,cv::RETR_EXTERNAL,cv::CHAIN_APPROX_SIMPLE); //remove contour if the area less than 100 auto it = std::remove_if(std::begin(contours),std::end(contours),[](std::vector<cv::Point> const &a) { return cv::boundingRect(a).area() < 100; }); //remove_if move unwanted elements to the backyard of the containers //you need to call the erase function of the containers to remove //unwanted elements contours.erase(it,std::end(contours)); //contour_analyzer is a class used to print out statistic info //of the contour ocv::contour_analyzer analyzer; //print_contour_attribute_name print out the attribute names //of the contours as following //CArea | BArea | Perimeter | Aspect | Extent | Solidity | PolySize ocv::print_contour_attribute_name(std::cout); for(size_t i = 0; i != contours.size(); ++i){ cv::drawContours(img,static_cast<int>(i),{0,0},2); std::cout<<analyzer.analyze(contours[i],0.1); cv::imshow("img",img); cv::waitKey(); } cv::imwrite("polygon.jpg",img); } 如果你运行程序(我从github使用opencv3克隆).你会发现有5个轮廓 他们的属性是 您可以尝试通过这些属性确定多边形的类型. detect_by_contour和morphology_skeleton的代码位于forum_quest. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- python collection模块中几种数据结构(Counter、OrderedDi
- ERROR: virtualenvwrapper could not find virtualenv in y
- python – 如何在我的网站上将WMD markdown语法转换为HTML?
- nagios插件--监控inodes
- python – 我的算法的运行时间复杂度 – 我如何计算并进一步
- Python配置mysql的教程(推荐)
- python – QWebKit linkClicked信号永远不会触发
- python爬虫实战之爬取京东商城实例教程
- Django中使用Celery
- 听说你还在用PS手动描边!Python抠图只需五秒!都不想用PS了