目标检测-基于轮廓字符计数

这篇博客介绍了如何使用OpenCV库进行字符检测。首先,通过灰度平均值法将彩色图像转换为灰度图像,然后利用Sobel算子计算梯度,进行边缘检测。接着,通过findContours函数找到图像的轮廓,以此来识别字符并计算其数量。最终,通过绘制轮廓并在图像上显示字符总数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于轮廓字符计数

1. 字符图片
在这里插入图片描述
2. 字符图片灰度化
将彩色图像转换成灰度图像,采用的灰度平均值法,公式为:H=0.229R+0.587G+0.144B(opencv,BGR格式) 公式中 H表示灰度图的亮度值;R代表彩色图像红色分量值;G代表色彩图像绿色分量值;B代表彩色图像蓝色分量值。RGB三分量前的系数为经验加权值,加权系数的取值建立在人眼的视觉模型之上。对于人眼较为敏感的绿色取较大的权值;对人眼较为不敏感的蓝色则取较小的权值。
灰度图
3. 梯度计算
边缘是指图像灰度发生空间突变或者在梯度方向上发生突变的像素的集合。本从采用Sobel算子,以X和Y方向上的梯度分别进行计算,最后通过混合加权得到整幅图像得梯度。
在这里插入图片描述
再利用Sobel算子计算时,白到黑是整数,黑到白就是负数,所有负数会被截断成0,所以要取绝对值。

X和Y方向上的梯度
通过加权合并两幅梯度图像
目标检测-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()

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Leon在努力啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值