opencv水平投影,opencv投影法
1.简介这篇文章将展示什么是图像的投影直方图,以及如何绘制这个投影直方图。例如,如果我们想识别一些字符,我们可以使用投影来提取图像上的特征。投影直方图是一种使用图像在给定方向(例如,垂直或水平方向)上的投影的方法。这些投影表示每一列或每一行中属于该对象的像素数。
2.投影直方图的功能。让我们看一个简单的例子,如下所示:
上图分别代表数字5及其垂直和水平投影。上述两个直方图可以用作数字5的向量描述符。在我们计算了它们与标识数字0到9的直方图向量之间的相似度之后,我们就可以知道当前的数字是多少了。
3.实际应用那么,我们来看一个实际项目中的具体栗子!
3.1读入图像和灰度。首先,我们使用opencv读取颜色图并执行灰度,如下所示:
导入cv2
将numpy作为np导入
将matplotlib.pyplot作为plt导入
导入操作系统
#加载图像
img=cv2 . im read( display _ image . png )
#转换为灰度
Gray=cv2.cvtcolor (img,cv2.color _ bgr2gray)结果如下:
上图的上半部分是输入的原始图像,下半部分是灰度图像。
3.2二值化然后我们对上图进行中值滤波去噪,再进行膨胀腐蚀操作。示例代码如下:
#平滑图像以避免噪声
gray=cv2.medianBlur(gray,5)
#应用自适应阈值
thresh=cv2 . adaptive threshold(gray,255,1,1,11,2)
#应用一些扩张和侵蚀来连接缝隙
kernel=np.ones((5,5),np.uint8)
thresh=cv2.dilate(thresh,kernel,iterations=2)
Thresh=cv2.erode (thresh,kernel,iterations=2)结果如下:
上图的上半部分是中值滤波后的图,下半部分是二元膨胀腐蚀后的图。
3.3 findContours然后我们使用函数findContours得到封闭区域的轮廓,过滤掉高度较小的轮廓。示例代码如下:
#寻找轮廓
轮廓,层次=cv2.findContours(thresh,cv2。RETR _列表,cv2。CHAIN_APPROX_SIMPLE)
#对于每个轮廓,找到边界矩形并绘制它
对于轮廓中的cnt:
x,y,w,h=cv2.boundingRect(cnt)
如果h 10:
2.CVrectangle (img,(x,y),(x w,y h),(0,255,0),2)结果如下:
3.4计算直方图最后,我们来计算向X轴方向的投影。相应的示例代码如下:
#图像的宽度和高度
高度,宽度=thresh.shape
#对价值线求和
vertical_px=np.sum(thresh,axis=0)
#正常化
规格化=vertical_px/255
#用零创建黑色图像
blank image=NP . zeros _ like(thresh)
#制作垂直投影直方图
对于idx,枚举中的值(正常化):
cv2.line(blankImage,(idx,0),(idx,height-int(value)),(255,255,255),1)
#连接图像
img _ concate=cv2.vconcat(
[img,cv2.cvtColor(blankImage,cv2。COLOR_BGR2RGB)])
cv2.imshow(out ,img _ concate)
2.cvwaitkey (0)获得以下结果:
请注意,观察上图中重复出现的数字,比如4和3,它们的垂直投影直方图几乎相同!
4.总结这篇文章是一篇简单的文章,向你展示如何简单的制作投影直方图,以及如何绘制。如本文所述,我们可以为每个字符建立一个存储向量,然后用它来对字符进行分类。
你丢了学业吗?
关注微信官方账号《AI算法之道》了解更多关于AI算法的信息。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。