文章目录[隐藏]
基于轮廓字符计数
1. 字符图片
2. 字符图片灰度化
将彩色图像转换成灰度图像,采用的灰度平均值法,公式为:H=0.229R+0.587G+0.144B(opencv,BGR格式) 公式中 H表示灰度图的亮度值;R代表彩色图像红色分量值;G代表色彩图像绿色分量值;B代表彩色图像蓝色分量值。RGB三分量前的系数为经验加权值,加权系数的取值建立在人眼的视觉模型之上。对于人眼较为敏感的绿色取较大的权值;对人眼较为不敏感的蓝色则取较小的权值。
3. 梯度计算
边缘是指图像灰度发生空间突变或者在梯度方向上发生突变的像素的集合。本从采用Sobel算子,以X和Y方向上的梯度分别进行计算,最后通过混合加权得到整幅图像得梯度。
再利用Sobel算子计算时,白到黑是整数,黑到白就是负数,所有负数会被截断成0,所以要取绝对值。
通过加权合并两幅梯度图像
目标检测-cv2.addWeighted
4.绘制轮廓
findContours:
mode:cv2.EXTERNAL 只检测最外围轮廓
method:cv2.CHAIN_APPROX_NONE 围绕边界周围构造出轮廓,以线条形式
轮廓的数量会存储在contours中,打印输出列表即可显示出字符数量。print(len(contours))
完整代码如下:
import cv2
import numpy as np
#打开图片
img_A = cv2.imread('CAR.jpg')
#灰度变换
def rgb2gray(img):
h=img.shape[0]
w=img.shape[1]
gray=np.uint8(np.zeros((h,w)))
for i in range(h):
for j in range(w):
gray[i,j]=0.144*img[i,j,0]+0.587*img[i,j,1]+0.299*img[i,j,2]#BGR
return gray
img_gray=rgb2gray(img_A)
cv2.imshow('1',img_gray)
cv2.imwrite("gray.jpg",img_gray)
# 将图像将根据阈值二值化处理
rest,thresh=cv2.threshold(img_gray,100,255,cv2.THRESH_BINARY_INV)
#求对X的梯度
img_x=cv2.Sobel(thresh,cv2.CV_64F,1,0,ksize=3)
img_x=cv2.convertScaleAbs(img_x)
#求对Y的梯度
img_y=cv2.Sobel(thresh,cv2.CV_64F,0,1,ksize=3)
img_y=cv2.convertScaleAbs(img_y)
img_add=cv2.addWeighted(img_x,0.5,img_y,0.5,0)
#img_hstack=np.hstack((img_x,img_y))
#cv2.imwrite("Grand.jpg",img_hstack)
#cv2.imshow('5',img_hstack)
contours, hierarchy=cv2.findContours(img_add,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
print(len(contours))#字符number
img_result=img_A.copy()
for contour in contours:
cv2.drawContours(img_result, [contour,], -1, (255, 0, 0), 2,0) # bule
cv2.putText(img_result, "number=%d" % (int(len(contours))),(100, 150),0,1,(255, 0, 0),3)
cv2.imshow('4',img_result)
cv2.waitKey()
版权声明:本文为CSDN博主「记住0和1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hello15617900040/article/details/121879406
暂无评论