Python OpenCV实现测量图片物体宽度


Posted in Python onMay 27, 2020

一、 题目描述

测量所给图片的高度,即上下边缘间的距离。

Python OpenCV实现测量图片物体宽度

思路:

  • 将图片进行阈值操作得到二值化图片。
  • 截取只包含上下边框的部分,以便于后续的轮廓提取
  • 轮廓检测
  • 得到结果

二、 实现过程

1.用于给图片添加中文字符

#用于给图片添加中文字符
def ImgText_CN(img, text, left, top, textColor=(0, 255, 0), textSize=20):
  if (isinstance(img, np.ndarray)): #判断是否为OpenCV图片类型
    img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
  draw = ImageDraw.Draw(img)
  fontText = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', textSize, encoding="utf-8")     ##中文字体
  draw.text((left, top), text, textColor, font=fontText)   #写文字
  return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

2.实现图片反色功能

#实现图片反色功能
def PointInvert(img):
  height, width = img.shape    #获取图片尺寸
  for i in range(height):
    for j in range(width):
      pi = img[i, j]
      img[i, j] = 255 - pi
  return img

3.边缘检测

# canny边缘检测
edges = cv2.Canny(th, 30, 70) 
res=PointInvert(edges)              #颜色反转
#显示图片
cv2.imshow('original', th)            #显示二值化后的图,主题为白色,背景为黑色 更加容易找出轮廓
key = cv2.waitKey(0)
if key==27: #按esc键时,关闭所有窗口
  print(key)
  cv2.destroyAllWindows()

4.轮廓操作

contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)    #得到轮廓

cnt = contours[0]        #取出轮廓

x, y, w, h = cv2.boundingRect(cnt)     #用一个矩形将轮廓包围

img_gray = cv2.cvtColor(res, cv2.COLOR_GRAY2BGR)        #将灰度转化为彩色图片方便画图

cv2.line(img_gray, (x, y), (x + w, y), (0,0,255), 2, 5)     #上边缘
cv2.line(img_gray, (x, y+h), (x + w, y+h), (0, 0, 255), 2, 5)  #下边缘

img1[80:230, 90:230] = img_gray     #用带有上下轮廓的图替换掉原图的对应部分

5.显示图片

res1=ImgText_CN(img1, '宽度%d'%h, 25, 25, textColor=(0, 255, 0), textSize=30)  #绘制文字
#显示图片 
cv2.imshow('original', res1)
key = cv2.waitKey(0)
if key==27: #按esc键时,关闭所有窗口
  print(key)
  cv2.destroyAllWindows()

6.完整代码

import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont

#用于给图片添加中文字符
def ImgText_CN(img, text, left, top, textColor=(0, 255, 0), textSize=20):
  if (isinstance(img, np.ndarray)): #判断是否为OpenCV图片类型
    img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
  draw = ImageDraw.Draw(img)
  fontText = ImageFont.truetype(r'C:\Windows\Fonts\simsun.ttc', textSize, encoding="utf-8")     ##中文字体
  draw.text((left, top), text, textColor, font=fontText)   #写文字
  return cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR)

#实现图片反色功能
def PointInvert(img):
  height, width = img.shape    #获取图片尺寸
  for i in range(height):
    for j in range(width):
      pi = img[i, j]
      img[i, j] = 255 - pi
  return img



img=cv2.imread("gongjian1.bmp",0)        #加载彩色图
img1=cv2.imread("gongjian1.bmp",1)        #加载灰度图

recimg = img[80:230, 90:230]          #截取需要的部分
img2 = img1[80:230, 90:230]           #截取需要的部分
ret, th = cv2.threshold(recimg, 90, 255, cv2.THRESH_BINARY)     #阈值操作二值化


# canny边缘检测
edges = cv2.Canny(th, 30, 70) 
res=PointInvert(edges)              #颜色反转
#显示图片
cv2.imshow('original', th)            #显示二值化后的图,主题为白色,背景为黑色 更加容易找出轮廓
key = cv2.waitKey(0)
if key==27: #按esc键时,关闭所有窗口
  print(key)
  cv2.destroyAllWindows()
  
contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)    #得到轮廓

cnt = contours[0]        #取出轮廓

x, y, w, h = cv2.boundingRect(cnt)     #用一个矩形将轮廓包围

img_gray = cv2.cvtColor(res, cv2.COLOR_GRAY2BGR)        #将灰度转化为彩色图片方便画图

cv2.line(img_gray, (x, y), (x + w, y), (0,0,255), 2, 5)     #上边缘

cv2.line(img_gray, (x, y+h), (x + w, y+h), (0, 0, 255), 2, 5)  #下边缘
img1[80:230, 90:230] = img_gray                 #用带有上下轮廓的图替换掉原图的对应部分

res1=ImgText_CN(img1, '宽度%d'%h, 25, 25, textColor=(0, 255, 0), textSize=30)  #绘制文字
#显示图片 
cv2.imshow('original', res1)
key = cv2.waitKey(0)
if key==27: #按esc键时,关闭所有窗口
  print(key)
  cv2.destroyAllWindows()

三、 运行结果(效果)

Python OpenCV实现测量图片物体宽度

Python OpenCV实现测量图片物体宽度

四、 问题及解决方法

红色轮廓没有显示,解决方案:将灰度图转化为彩色图

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现周期性抓取网页内容的方法
Nov 04 Python
python数据结构链表之单向链表(实例讲解)
Jul 25 Python
Pandas 按索引合并数据集的方法
Nov 15 Python
python 判断矩阵中每行非零个数的方法
Jan 26 Python
学习python可以干什么
Feb 26 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
Django ORM 查询管理器源码解析
Aug 05 Python
对Django 转发和重定向的实例详解
Aug 06 Python
python中什么是面向对象
Jun 11 Python
Python实现迪杰斯特拉算法过程解析
Sep 18 Python
python产生模拟数据faker库的使用详解
Nov 04 Python
python 制作简单的音乐播放器
Nov 25 Python
Python中socket网络通信是干嘛的
May 27 #Python
Python中SQLite如何使用
May 27 #Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
May 27 #Python
Python中如何引入第三方模块
May 27 #Python
Python中的wordcloud库安装问题及解决方法
May 27 #Python
Python Dataframe常见索引方式详解
May 27 #Python
Python代码中如何读取键盘录入的值
May 27 #Python
You might like
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
php+mysql数据库查询实例
2015/01/21 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
JavaScript中json对象和string对象之间相互转化
2012/12/26 Javascript
一个简单的Node.js异步操作管理器分享
2014/04/29 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
2014/09/01 Javascript
JavaScript中的索引数组、关联数组和静态数组、动态数组讲解
2014/11/08 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
JavaScript对数组进行随机重排的方法
2015/07/22 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
JavaScript数组操作详解
2017/02/04 Javascript
angularJs的ng-class切换class
2017/06/23 Javascript
JavaScript实现旋转轮播图
2020/08/18 Javascript
Node.js使用MySQL连接池的方法实例
2018/02/11 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
[01:13:59]LGD vs Mineski Supermajor 胜者组 BO3 第三场 6.5
2018/06/06 DOTA
Python对小数进行除法运算的正确方法示例
2014/08/25 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
python获取引用对象的个数方式
2019/12/20 Python
Python 如何创建一个线程池
2020/07/28 Python
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
中专生自我鉴定书范文
2013/12/28 职场文书
《一件运动衫》教学反思
2014/02/19 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
2014小学生国庆65周年演讲稿
2014/09/21 职场文书
小学向国旗敬礼活动方案
2014/09/27 职场文书
2014年语文教研组工作总结
2014/12/06 职场文书
地方课程教学计划
2015/01/19 职场文书
驾驶员安全责任协议书
2016/03/22 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS