机器视觉 图片处理

  • 一:图片二值化
    • 1. 什么是二值化
    • 2. 代码
    • 3. 结果展示
  • 二:寻找物体轮廓
    • 1. 主要函数
    • 2. 代码
    • 3.结果展示
  • 三:二值化+边框
  • 四:结语

边缘识别+轮廓识别+边框+二值化
环境:ubuntu+python
部分代码摘自网络

一:图片二值化

1. 什么是二值化

将图像上的像素点的灰度值设为0或255,整个图像呈现出黑白效果。
所有灰度大于或等于阈值的像素被判定为属于特定物体,其灰度值为255表示,
否则这些像素点被排除在物体区域以外,灰度值为0,表示背景或者例外的物体区域。

2. 代码

# 图片二值化
from PIL import Image
img = Image.open('p16.jpg')# 模式L”为灰色图像
Img = img.convert('L')
Img.save("test1.jpg") #保存# 自定义灰度界限
threshold = 200
table = []
for i in range(256):if i < threshold:table.append(0)else:table.append(1)# 二值化并保存
photo = Img.point(table, '1')
photo.save("test2.jpg")

3. 结果展示



分别为原图-灰度图-黑白图,对结果不满意可进行进一步降噪操作。

二:寻找物体轮廓

本部分代码参考 Python+Opencv测量物体之间的距离

1. 主要函数

@图片处理
# 执行灰度变换
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)#颜色空间转换函数,需要转换的图片,转换成何种格式。
gray = cv2.GaussianBlur(gray, (7, 7), 0) #高斯滤波
@边缘检测
edged = cv2.Canny(gray, 50, 100)# 执行Canny边缘检测
edged = cv2.dilate(edged, None, iterations=1)#膨胀:求局部最大值,使图像中的高亮区域逐渐增长
edged = cv2.erode(edged, None, iterations=1)#腐蚀:求局部最小值
#先膨胀后腐蚀,闭运算,填充物体内黑洞,连接邻近物体和平滑边界
@寻找轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#参数1:原图像;参数2:轮廓信息的组织形式:只有外侧轮廓;参数3:压缩水平方向,垂直方向,对角线方向的元素,只保留端点;
返回值:输出:image图片(opencv3才有);
轮廓contours:list结构,列表中每个元素代表一个边沿信息。每个元素是(x,1,2)的三维向量,x表示该条边沿里共有多少个像素点,第三维的那个“2”表示每个点的横、纵坐标;
hierarchy:返回类型是(x,4)的二维ndarray。x和contours里的x是一样的意思。四列分别对应下一个轮廓编号、上一个轮廓编号、父轮廓编号、子轮廓编号,该值为负数表示没有对应项。
@外接矩形(打框)
box = cv2.minAreaRect(c) #计算最小的外接矩形,获取最小外接矩阵,中心点坐标,宽高,旋转角度
box = cv2.cv.BoxPoints(box) #获取矩形四个顶点,浮点型
box = np.array(box, dtype="int") #转成数组的ndarray对象,取整
box = perspective.order_points(box) #排序:左上、右上、右下、左下
@绘制轮廓与边框
cv2.drawContours(orig, [c.astype("int")],-1, (0, 255, 0), 2)#绘制边框
cv2.drawContours(orig, [box.astype("int")], -1, (0, 255, 0), 1)# 绘制轮廓
参数1:图片;参数2:轮廓;参数3:-1,绘制所有轮廓;参数4:color;参数5:轮廓线宽度

2. 代码

# coding=utf-8
# 导入相应的pthon包
from PIL import Image
from scipy.spatial import distance as dist
from imutils import perspective
from imutils import contours
import numpy as np
import argparse
import imutils
import cv2def draw_rect(cnts,orig):for c in cnts:# 过滤点太小的轮廓点if cv2.contourArea(c) < 100:continue# 计算最小的外接矩形box = cv2.minAreaRect(c)box = cv2.cv.BoxPoints(box) if imutils.is_cv2() else cv2.boxPoints(box)box = np.array(box, dtype="int")# 对轮廓点进行排序:左上、右上、右下、左下box = perspective.order_points(box)   # 绘制轮廓#cv2.drawContours(orig, [box.astype("int")], -1, (0, 255, 0), 1)cv2.drawContours(orig, [c.astype("int")],-1, (0, 255, 0), 2)return orig# 进行参数配置和解析
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="path to the input image")
args = vars(ap.parse_args())# 读取图片
image = cv2.imread(args["image"])
#image = cv2.imread('/home/e/01.jpg')
# 执行灰度变换
#颜色空间转换函数,需要转换的图片,转换成何种格式。
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 执行高斯滤波
gray = cv2.GaussianBlur(gray, (7, 7), 0)# 执行Canny边缘检测
edged = cv2.Canny(gray, 50, 100)
# 执行腐蚀和膨胀处理
edged = cv2.dilate(edged, None, iterations=1)
edged = cv2.erode(edged, None, iterations=1)
# 在边缘映射中寻找轮廓
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = imutils.grab_contours(cnts)# 对轮廓点进行排序
(cnts, _) = contours.sort_contours(cnts)
# 设置显示颜色
colors = ((0, 0, 255), (240, 0, 159), (0, 165, 255), (255, 255, 0), (255, 0, 255))orig=image.copy()
#画框
orig=draw_rect(cnts,orig)# 显示结果
cv2.imshow("Image", orig)
cv2.imwrite('cnts.jpg',orig)#cv2.imshow("mask", mask)
#cv2.imwrite('d.jpg',mask)cv2.waitKey(0)

3.结果展示

三:二值化+边框

实验发现,原图直接寻找轮廓打边框,不适用于本例中的立体图;现采用二值化后的图片进行打框操作。

四:结语

canny+opencv 对于平面图有较好的效果,对于本例中的图片,不能很好的找到其轮廓和边框。三维物体轮廓识别待研究!

边缘识别+轮廓识别+边框+二值化相关推荐

  1. 使用tesserocr二值化识别知网登录验证码

    随机获取了知网登录界面的三个图片验证码,测试 tesserocr 识别验证码的准确度 编写代码,先测试pic1 import tesserocr # 导入tesserocr模块 from PIL im ...

  2. OpenCV自适应二值化

    关于直方图的理解:http://blog.csdn.net/sheldonwxp/article/details/7693541 //全局自适应方法 double threshold( InputAr ...

  3. linux 正点原子ov5640_【正点原子FPGA连载】第二十六章基于OV5640的二值化实验-摘自【正点原子】领航者 ZYNQ 之嵌入式开发指南 (amobbs.com 阿莫电子论坛)...

    本帖最后由 正点原子 于 2020-10-26 16:21 编辑 QQ群头像.png (1.78 KB) 2020-10-24 10:50 上传5)关注正点原子公众号,获取最新资料 100846rel ...

  4. Python实现图片二值化

    1. 什么是二值化 图像二值化就是将图像上的像素点的"灰度值"设置为[0, 0, 0]或[255, 255, 255],即要么纯黑,要么纯白. 2. 二值化的作用 通过二值化,能更 ...

  5. java图像处理:灰度化,二值化,降噪,切割,裁剪,识别,找相似等

    前段时间做爬虫,涉及到对图片验证码的破解,这里罗列一些常用的图像处理方法,都很简单并没用到什么复杂的算法,所以不涉及opencv,都是一些直接对rgb像素点的操作,很简单也很好理解,至于识别直接用的t ...

  6. Python-OpenCV 处理图像(六)(七)(八):对象识别 图像灰度化处理 图像二值化处理

    为了加快处理速度,在图像处理算法中,往往需要把彩色图像转换为灰度图像. 0x00. 灰度图 灰度数字图像是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度. 灰度图像与黑 ...

  7. 基于C++(QT)的车牌识别实现——二值化处理

    文章目录 拟采用的技术路线 车牌图片打开 图片二值化 窗口UI实现 拟采用的技术路线 本次设计计划以最快的速度实现一个清晰车牌的识别,后续再增加识别精确度,故采取以下技术路线本篇文章主要讲述图像二值化 ...

  8. matlab 二值化_基于MATLAB的指纹识别系统[GUI界面+万字技术文档+语音播报]

    一.课题介绍 本设计为基于MATLAB的指纹识别系统.本设计系统主要对指纹图像进行三方面处理:图像预处理.特征提取和特征匹配.图像预处理包括四个步骤:图像灰度化.滤波增强.二值化.细化,对指纹图像进行 ...

  9. 数字识别java开源_Java基于opencv实现图像数字识别(三)—灰度化和二值化

    Java基于opencv实现图像数字识别(三)-灰度化和二值化 一.灰度化 灰度化:在RGB模型中,如果R=G=B时,则彩色表示灰度颜色,其中R=G=B的值叫灰度值:因此,灰度图像每个像素点只需一个字 ...

最新文章

  1. NAACL19笔记:自然语言处理应用的实用理解(多图解链接)
  2. 大数据2 Hadoop伪分布模式配置部署
  3. 亿级 Web 系统的容错性建设实践
  4. iOS开发月报#10|201904
  5. css文件内容的组织
  6. 人脸识别 face_recognition
  7. 关于百度富文本编辑器UEditor中ctrl+enter键发送消息的解决方案
  8. 原来大家最拼命的时候是这样子的
  9. hive实现两列数据合并成一列
  10. 白帽黑客郭盛华:供应链枢纽需要从网络安全开始
  11. tsconfig.json详细配置
  12. 装多系统的U盘启动盘的制作
  13. 如何在安卓手机上编辑Excel表格?
  14. 华为云服务器数据库连接失败
  15. 计算机等级考试Python二级
  16. com.google.common.base.Stopwatch 应用
  17. 力扣第378题 有序矩阵中第K小的元素
  18. 参考文献格式国家标准GB T7714-2015
  19. Qt运行过程中错误未找到信号的符号undefined symbol: _ZN11FileManager12sigTechFilesE4QMapIi7QSt
  20. 为什么Chrome比其他浏览器快?

热门文章

  1. css3 transition 简易动画
  2. 字节旗下火山引擎违规分发SkyWalking,更改所有包名、删除Apache基金会抬头
  3. 7.Hive性能优化及Hive3新特性
  4. JVM 类加载机制及双亲委派模型
  5. 学python要不要先自学c语言_学习Python之前是否需要学习C语言
  6. 如何写好软件项目的工作计划-确定目标(二)
  7. HUAWEI eNSP模拟器AC设备登录WEB管理界面
  8. Linux下更高级的网络配置(网络桥接、bond及team网络接口的配置)
  9. 工程文档CAD转换必备!在线快速将 DWF 转换为 PDF
  10. 吴恩达深度学习笔记-损失函数和成本函数