当前位置: 首页 > wzjs >正文

哪个公司建立网站好有了网站源码如何做网页

哪个公司建立网站好,有了网站源码如何做网页,内容分发网络CDN可以建设网站吗,工程在哪个网站做推广比较合适前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识,这里我们以车牌号码识别这一案例来实操一下。 大致思路 车牌号码识别的大致流程可以分为这三步:图像预处理-寻找车牌轮廓-车牌OCR识别 接下来我们按照这三步来进行讲解。 图像预处理 …

    前边我们已经讲解了使用cv2进行图像预处理与边缘检测等方面的知识,这里我们以车牌号码识别这一案例来实操一下。

大致思路

        车牌号码识别的大致流程可以分为这三步:图像预处理-寻找车牌轮廓-车牌OCR识别

接下来我们按照这三步来进行讲解。

图像预处理

首先,在网上随便找一张车牌照:

读取图像 

#读取原始图像
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
src_path=r'LicensePlate.jpg'
src_image=cv2.imread(filename=src_path,flags=cv2.IMREAD_COLOR_RGB)
print(src_image.shape)
plt.title('原始图像')
plt.imshow(src_image)

        这里我使用matplotlib的imshow函数来显示图像,这样在jupyter环境中可以不打开任何弹窗直接显示图像,比较方便。

转为灰度图

#转为灰度图
gray_image=cv2.cvtColor(src=src_image,code=cv2.COLOR_RGB2GRAY)
plt.title('原始图像(灰度图)')
plt.imshow(gray_image,cmap='gray')

        将原始图像转化为灰度图是为了后续的检测等操作,在计算机视觉任务中,基本上所有的操作都是针对灰度图来进行的,灰度图是将原始图像的多个通道按照一定权重求和叠加而来,这样一来多通道变成了单通道(Gray=w_1*B+w_2*G+w_3*R),在计算量上也会比较友好。

 阈值化

#阈值化
thresh,binary_image=cv2.threshold(src=gray_image,thresh=128,maxval=255,type=cv2.THRESH_OTSU+cv2.THRESH_BINARY)
plt.imshow(binary_image,cmap='gray')

        阈值化是为了后续的边缘检测,通常在边缘检测前都需要对图像进行阈值化操作,这样识别出来的边缘相对准确。这里阈值化我们使用cv2.THRESH+cv2.THRESH-OTSU方法来自动对图像进行二值化阈值分割。 

边缘检测

#canny边缘检测
edges=cv2.Canny(image=binary_image,threshold1=0.5*thresh,threshold2=thresh,apertureSize=5,L2gradient=True)
plt.imshow(edges,cmap='gray')

        边缘检测是为了初步提取出车牌的轮廓,便于后续的轮廓查找。常用的边缘检测算法有Canny、Sobel、Prewitt等,其中Canny算法具有较高的准确性和鲁棒性,因此在本系统中采用Canny算法进行边缘检测。不太熟悉边缘检测的小伙伴可以去看看我的往期文章:

https://blog.csdn.net/weixin_73953650/article/details/146284620?sharetype=blogdetail&sharerId=146284620&sharerefer=PC&sharesource=weixin_73953650&spm=1011.2480.3001.8118https://blog.csdn.net/weixin_73953650/article/details/146284620?sharetype=blogdetail&sharerId=146284620&sharerefer=PC&sharesource=weixin_73953650&spm=1011.2480.3001.8118

 车牌轮廓查找

#寻找矩形区域轮廓
contours,hiercahy=cv2.findContours(edges,mode=cv2.RETR_TREE,method=cv2.CHAIN_APPROX_SIMPLE)
contours=sorted(contours,key=cv2.contourArea,reverse=True)[:10]
rectangle=None
for point in contours:peri=cv2.arcLength(point,True)polygons=cv2.approxPolyDP(curve=point,epsilon=0.018*peri,closed=True)if len(polygons)==4:rectangle=polygonsplateArea=pointbreak
gray_image_copy=gray_image.copy()
src_image_copy=src_image.copy()
cv2.drawContours(image=src_image_copy,contours=[rectangle],contourIdx=0,color=(255,0,0),thickness=5)
cv2.drawContours(image=gray_image_copy,contours=[rectangle],contourIdx=0,color=255,thickness=5)
figure=plt.figure(figsize=(10,10),dpi=100)
plt.subplot(1,2,1),plt.imshow(src_image_copy),plt.title('车牌定位结果(原始图像)')
plt.subplot(1,2,2),plt.imshow(gray_image_copy,cmap='gray'),plt.title('车牌定位结果(灰度图)')

 

 

         查找轮廓时我们通常使用findContours函数来进行查找(返回值为所有可能的轮廓点contours以及这些点之间的拓扑结构hierachy),考虑到车牌是矩形区域,因此我们可以在查找到的轮廓点中使用cv2.approxPolyDP函数来对查找到的轮廓进行多边形拟合(返回值为各个顶点的坐标构成的列表)只要拟合出的多边形顶点个数为4,那么必然是车牌位置。

       然后,我们再使用cv2.drawContours函数将其在原始图像中标记出来即可。

车牌分割

# #分割提取车牌
x=[location[0][0] for location in plateArea]
y=[location[0][1] for location in plateArea]
Licenseplate=gray_image[min(y):max(y),min(x):max(x)]#切片图像
plt.imshow(Licenseplate,cmap='gray')
cv2.imwrite('Plate.jpg',Licenseplate)

 

 

        将车牌从原始图像中分割出来的思路也很简单,就是根据我们查找到的轮廓点,来查找其在图像中的位置。PlatArea是矩形车牌轮廓点构成的列表,其内部为各个点的坐标,其中对于任意一点location来说,location[0][0]表示x坐标,location[0][1]表示y坐标。那么,我们只需找到所有x坐标中的最小值与最大值,y坐标中的最小值与最大值,即可确定这个矩形区域在原图像中的范围。 

 最后,我们还需将这个车牌号码保存一下以便后续的字符识别

OCR识别

        考虑到车牌是标准的印刷体,这里我们使用现成的OCR字符识别库,这里我使用的是ddddocr

获取方式

pip install ddddocr

OCR识别

#使用ddddocr进行光学识别
import ddddocr
ocr=ddddocr.DdddOcr(show_ad=False,beta=True)
image=open('Plate.jpg','rb')
answer=ocr.classification(image.read())
image.close()
print(f'车牌号为:{answer.upper()}')
plt.imshow(src_image,cmap='gray')
plt.text(x=src_image.shape[1]//4,y=src_image.shape[0]/2,s=f'车牌号为:{answer.upper()}',size=20,color='red')

 

        使用ddddocr时需要传入的图像数据是Bytes类型,因此我们使用open(‘.jpg’,'rb').read()语句即可实现读取图像的bytes数据,最后我们再将得到的结果其标注在原始图像上。 

 

完整代码

#读取原始图像
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
src_path=r'LicensePlate.jpg'
src_image=cv2.imread(filename=src_path,flags=cv2.IMREAD_COLOR_RGB)
print(src_image.shape)
plt.title('原始图像')
plt.imshow(src_image)
#转为灰度图
gray_image=cv2.cvtColor(src=src_image,code=cv2.COLOR_RGB2GRAY)
plt.title('原始图像(灰度图)')
plt.imshow(gray_image,cmap='gray')
#阈值化
thresh,binary_image=cv2.threshold(src=gray_image,thresh=128,maxval=255,type=cv2.THRESH_OTSU+cv2.THRESH_BINARY)
plt.imshow(binary_image,cmap='gray')
#canny边缘检测
edges=cv2.Canny(image=binary_image,threshold1=0.5*thresh,threshold2=thresh,apertureSize=5,L2gradient=True)
plt.imshow(edges,cmap='gray')
#寻找矩形区域轮廓
contours,hiercahy=cv2.findContours(edges,mode=cv2.RETR_TREE,method=cv2.CHAIN_APPROX_SIMPLE)
contours=sorted(contours,key=cv2.contourArea,reverse=True)[:10]
rectangle=None
for point in contours:peri=cv2.arcLength(point,True)polygons=cv2.approxPolyDP(curve=point,epsilon=0.018*peri,closed=True)if len(polygons)==4:rectangle=polygonsplateArea=pointbreak
gray_image_copy=gray_image.copy()
src_image_copy=src_image.copy()
cv2.drawContours(image=src_image_copy,contours=[rectangle],contourIdx=0,color=(255,0,0),thickness=5)
cv2.drawContours(image=gray_image_copy,contours=[rectangle],contourIdx=0,color=255,thickness=5)
figure=plt.figure(figsize=(10,10),dpi=100)
plt.subplot(1,2,1),plt.imshow(src_image_copy),plt.title('车牌定位结果(原始图像)')
plt.subplot(1,2,2),plt.imshow(gray_image_copy,cmap='gray'),plt.title('车牌定位结果(灰度图)')
# #分割提取车牌
x=[location[0][0] for location in plateArea]
y=[location[0][1] for location in plateArea]
Licenseplate=gray_image[min(y):max(y),min(x):max(x)]#切片图像
plt.imshow(Licenseplate,cmap='gray')
cv2.imwrite('Plate.jpg',Licenseplate)
#使用ddddocr进行光学识别
import ddddocr
ocr=ddddocr.DdddOcr(show_ad=False,beta=True)
image=open('Plate.jpg','rb')
answer=ocr.classification(image.read())
image.close()
print(f'车牌号为:{answer.upper()}')
plt.imshow(src_image,cmap='gray')
plt.text(x=src_image.shape[1]//4,y=src_image.shape[0]/2,s=f'车牌号为:{answer.upper()}',size=20,color='red')

总结 

 

        以上便是计算机视觉cv2入门之车牌号码识别的所有内容,如果本文对你有用,还劳驾各位一键三连支持一下博主。

http://www.dtcms.com/wzjs/545561.html

相关文章:

  • 建站之星官网建设市桥网站建设培训
  • 英国帮人做设计作业网站个人如何开投资公司
  • 公司主页网站制作mysql 收费 网站建设
  • 可以直接进入网站的正能量没封的长沙网站开
  • 西安大型网站建设喜欢做木工 网站
  • 做数据的网站有哪些全网自助下单最便宜
  • 国外的优秀网站专业做h5网站
  • 低价建设手机网站百度一下你就知道啦
  • 设计软件网站活在永久免费服务器
  • 定制制作网站开发wordpress博客人物插件
  • sql数据库查询网站模板信息平台网站建设
  • 门户网站建设自查整改报告的推网站模板
  • thinkphp 门户网站网络营销外包专家
  • 做响应式网站的常用尺寸提高工作效率英语
  • 如何做设计网站页面注册网站建设
  • 扬州做网站的公司哪个好网站设计参考网站
  • 网站备案怎样提交到管局武昌网站制作建设
  • 最新足球新闻头条上海专业排名优化公司
  • 在哪个网站可以学做甜点做网站和优化
  • 个人姓名最多备案多少个网站ui设计师作品集网站
  • 江苏自助建站系统哪家好wordpress tag多条件选择
  • 新浪网页广州营销优化
  • 如何做网站评估分析常州制作公司网站
  • 营口公司网站建设家具网站建设策划书
  • wordpress的菜单和页面跳转seo是什么服
  • 临沂建设中专官方网站seo推广计划类型可以分为什么
  • 铁汉生态建设有限公司网站站长工具查询域名
  • 网站需要哪些网站建设平台的分析
  • asp 做购物网站深圳网站制作公司信息
  • 上海免费建站模板网站建设z