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 mysqldb连接数据库
Mar 16 Python
寻找网站后台地址的python脚本
Sep 01 Python
Python中用pycurl监控http响应时间脚本分享
Feb 02 Python
探究python中open函数的使用
Mar 01 Python
tensorflow 打印内存中的变量方法
Jul 30 Python
基于pycharm导入模块显示不存在的解决方法
Oct 13 Python
Python提取支付宝和微信支付二维码的示例代码
Feb 15 Python
Python3安装pip工具的详细步骤
Oct 14 Python
django从后台返回html代码的实例
Mar 11 Python
python学习将数据写入文件并保存方法
Jun 07 Python
Python使用lambda抛出异常实现方法解析
Aug 20 Python
详解使用Python写一个向数据库填充数据的小工具(推荐)
Sep 11 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实现图片局部打马赛克的方法
2015/02/11 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
『JavaScript』限制Input只能输入数字实现思路及代码
2013/04/22 Javascript
node.js中的fs.writeFileSync方法使用说明
2014/12/14 Javascript
javascript事件冒泡实例分析
2015/05/13 Javascript
jQuery实现表格行上移下移和置顶的方法
2015/05/22 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
jquery+css3实现会动的小圆圈效果
2016/01/27 Javascript
js表单登陆验证示例
2016/10/19 Javascript
jQuery实现获取h1-h6标题元素值的方法
2017/03/06 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
Emberjs 通过 axios 下载文件的方法
2019/09/03 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[00:35]可解锁地面特效
2018/12/20 DOTA
python从网络读取图片并直接进行处理的方法
2015/05/22 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
Python实现批量压缩图片
2018/01/25 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Falsk 与 Django 过滤器的使用与区别详解
2019/06/04 Python
Linux下通过python获取本机ip方法示例
2019/09/06 Python
基于python实现把图片转换成素描
2019/11/13 Python
Python 之 Json序列化嵌套类方式
2020/02/27 Python
django 读取图片到页面实例
2020/03/27 Python
Django数据库迁移常见使用方法
2020/11/12 Python
APM Monaco中国官网:来自摩纳哥珠宝品牌
2017/12/27 全球购物
Office DEPOT法国官网:欧迪办公用品采购
2018/01/03 全球购物
银行营业厅大堂经理岗位职责
2014/01/06 职场文书
社团文化节邀请函
2014/01/10 职场文书
电视节目策划方案
2014/05/16 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
交通事故赔偿协议书
2014/10/16 职场文书
2014年环卫工作总结
2014/11/22 职场文书
个人求职意向书
2015/05/11 职场文书
python中Pyqt5使用Qlabel标签播放视频
2022/04/22 Python