OpenCv 练习题 霍夫(Hough)变换
霍夫(Hough)变换
题目:计算黑子之间的距离与白字之间的距离,得到两个最大值,运用直线画出连接两段距离最大的黑子和白子的直线,运用hough直线检验出棋盘的中本来的黑线,以不同颜色画出。
from cv2 import cv2
from matplotlib import pyplot as plt
import numpy as np
import mathdef calDistance(img):cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)cv2.imshow("cimg", cimg)cv2.waitKey(0)cv2.destroyAllWindows()# 进行霍夫圆检测,参数为:单通道图像(灰度图),检测方法,累加器分辨率与图像分辨率的反比,两圆的最小距离,# param1:用于处理边缘检测的梯度值方法, param2:累加器阈值, 最小半径,最大半径circles = cv2.HoughCircles(img, cv2.HOUGH_GRADIENT, 1, 20, param1=100, param2=27, minRadius=10, maxRadius=50)MAX = 0for num in range(0, 10): # white is 9, black is 10,最多循环10次就可以遍历所有圆count = num#print("num:{}".format(num))for i in circles[0, num:]: # 获取圆心的坐标,从第num个开始,即每个圆都会和其他圆连接一次,测量距离#print("count:{}".format(count))if count is num: # 当前是循环的开头时# lastPoint = (i[0], i[1])# 记录当前圆心作为标记点lastX = i[0]lastY = i[1]# print("last:")# print((lastX,lastY))else: # 循环的第二位开始,计算两圆心距离# newPoint = (i[0], i[1])# 当前圆心与标记点测距newX = i[0]newY = i[1]# print("new")# print((newX,newY))# 将计算分步,适度调节minus1 = lastX - newX # 得到差值minus2 = lastY - newY # 不能反写,会溢出# print(minus1)# print(minus2)part1 = math.pow(minus1, 2) # 求平方part2 = math.pow(minus2, 2)dis = int(math.sqrt(part1 + part2)) # 开根号求两圆心距离# print(dis)# 如果当前两圆心距离dis大于最大距离,则替换最大距离MAXif dis > MAX:MAX = dis# 记录距离最大时的两点坐标,用于连线point1 = (newX,newY)point2 = (lastX,lastY)# 根据圆心坐标画圈,显示检测到的棋子cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)count += 1print("MAX:{}".format(MAX))# 将最大距离的两个圆心连起来cv2.line(cimg,point1,point2,(0,0,255),3)cv2.imshow('cimg',cimg)cv2.waitKey(0)cv2.destroyAllWindows()readimg = cv2.imread('../image/weiqi.png', 0) # 读取灰度图,用于下面的霍夫检测
blurimg = cv2.medianBlur(readimg, 5)
img = cv2.cvtColor(blurimg,cv2.COLOR_GRAY2BGR) # 将灰度图转化为BGR原图,用于显示霍夫变换绘画直线的图像
img1 = cv2.threshold(blurimg,127,255,cv2.THRESH_TOZERO)[1] # white - 9,二值化将黑棋子去除,只检测白棋子
img2 = cv2.threshold(blurimg,153,255,cv2.THRESH_TOZERO_INV)[1] # black - 10,二值化将白棋子去除,只检测黑棋子
# 使用函数,计算最大圆心距离,并绘制出图像
calDistance(img1)
calDistance(img2)
edges = cv2.Canny(readimg,50,150,apertureSize=3) # 通过边缘检测,使得图像更加分明,便于霍夫变换时绘画直线
cv2.imshow('edge',edges)
cv2.waitKey(0)
# 霍夫变换,cv2.HoughLines
lines = cv2.HoughLines(edges,1,np.pi/180,114)
# for rho,theta in lines[0]: # 此语句只能显示一条直线# 将霍夫变换检测到的直线全部绘画出来
for i in range(0,len(lines)):rho,theta = lines[i][0][0],lines[i][0][1] # 获取直线的rho和theta角度# 线段的两端坐标求解,从极坐标转换a = np.cos(theta)b = np.sin(theta)x0 = a*rhoy0 = b*rhox1 = int(x0 + 1000*(-b))y1 = int(y0 + 1000*(a))x2 = int(x0 - 1000*(-b))y2 = int(y0 - 1000*(a))cv2.line(img,(x1,y1),(x2,y2),(0,255,0),2)cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
实现效果:
原图:
求白棋子间的最大距离:
求黑棋子间的最大距离:
用直线绘出棋盘格子:
结语: 本题采用霍夫圆检测得到各个圆的信息,但是也可以通过模板匹配,得到每个圆的外接矩形的左上角坐标,进而得到各个圆的信息。
OpenCv 练习题 霍夫(Hough)变换相关推荐
- OpenCV中霍夫直线变换
OpenCV中霍夫直线变换 首先要知道,一条直线的通用表达式为y=ax+b\color{#F00}y=ax+by=ax+b,a为直线的斜率,b为直线的截距,知道这两个参数可以唯一确定一条直线.通常我们 ...
- OpenCV3学习(6.2)——霍夫(Hough)变换:霍夫线变换HoughLine,霍夫圆变换HoughCircles
霍夫变换是图像处理中从图像中识别几何形状的基本方法之一,应用很广泛,也有很多改进算法.主要用来从图像中分离出具有某种相同特征的几何形状(如,直线,圆等).最基本的霍夫变换是从黑白图像中检测直线(线段) ...
- 花老湿学习OpenCV:霍夫线变换与直线检测
引言: 霍夫变换(Hough Transform)是图像处理中的一种特征提取技术,它通过一种投票算法检测具有特定形状的物体.该过程在一个参数空间中通过计算累计结果的局部最大值得到一个符合该特定形状的集 ...
- python 霍夫直线变换_霍夫线变换
目录:一.引入极坐标 二.霍夫线变换实现原理 三.图像中的霍夫线变换 四.概率霍夫变换 五.Python 例子 六.参考 Hough线变换是一种用于检测直线的变换.它最大的优点是,即使是虚线(dash ...
- 缺点 霍夫圆_霍夫线变换,霍夫圆变换
在图像处理和计算机视觉领域中,如何从当前的图像中提取所需要的特征信息是图像识别的关键所在.在许多应用场合中需要快速准确地检测出直线或者圆.其中一种非常有效的解决问题的方法是霍夫(Hough)变换,其为 ...
- OpenCV 霍夫线变换Hough Line Transform
OpenCV 霍夫线变换Hough Line Transform 霍夫线变换Hough Line Transform 目标 理论 霍夫线变换 它是如何工作的? 标准概率霍夫线变换 这个程序做什么? 代 ...
- OpenCV中的霍夫线变换、概率霍夫线变换
OpenCV中的霍夫线变换.概率霍夫线变换 1. 效果图 2. 原理 2.1 什么是霍夫变换? 2.2 什么是概率霍夫变换? 3. 源码 3.1 霍夫变换 3.2 概率霍夫变换 参考 这篇博客将介绍P ...
- OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
本篇文章中,我们一起探讨了OpenCV中霍夫变换相关的知识点,以及了解了OpenCV中实现霍夫线变换的HoughLines.HoughLinesP函数的使用方法,实现霍夫圆变换的HoughCircle ...
- opencv 霍夫线变换
霍夫线变换 霍夫线变换是一种用来寻找直线的方法. 是用霍夫线变换之前, 首先要对图像进行边缘检测的处理,也即霍夫线变换的直接输入只能是边缘二值图像. 它是如何实现的? 众所周知, 一条直线在图像二维空 ...
最新文章
- 2020年AI将会如何发展?吴恩达、周志华、Yann LeCun等大神对2020年 AI 发展趋势的预测的预测...
- 奥的斯GECS系统服务器手册,奥的斯电梯GECS 扶梯控制柜介绍.pdf
- iOS Sprite Kit教程之xcode安装以及苹果帐号绑定
- python gzipped source tarball,下载及安装Python详细步骤
- django实现长链接
- Terrarium 1.2
- python中用来占位_python 占位符
- 【Scratch】青少年蓝桥杯_每日一题_4.19_考试成绩
- 中国大学MOOC 计算机组成原理第4章 测试(上)
- mysql 局域网连接失败
- Linux环境下为普通用户添加sudo权限
- 拼写检查工具是android,拼写检查工具框架 | Android 开发者 | Android Developers...
- IBM的人工智能“沃森”首次确诊罕见白血病,只用了10分钟!
- 怎样把网站js文件合并成一个?几种方法可以实现
- MySQL与Oracle的DDL、DML语法对比(含可重复执行SQL脚本编写方式)
- 编译器vc6 新手使用教程(C、C++)
- Win7连接共享打印机时,报 0x00000bcb 错误
- MapGIS制图学习(2)
- Flash 第九章 运动补间动画
- Logistic回归分类器