2019-05-28 21:58:23 weixin_43559676 阅读数 99
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2538 人正在学习 去看看 贾志刚

数字图像处理基础知识

随计算机技术的发展,20世纪50年代,人们应用计算机处理一些图形和图像信息,这是最早的图像处理;20世纪60年代,人们应用计算机改善图像的质量,这时形成了数字图像处理这门学科。本章主要介绍数字图像处理的基础内容,包括什么是数字图像基础、图像的表示方法、图像的数据结构以及计算机中图像文件格式。

一 数字图像处理简介
数字图像处理(Digital Image Processing)是一种将图像信号数字化后利用计算进行处理的技术。随着计算机科学的发展,数字图像处理已经广泛的应用到各领域之中。
图像的概念
图像就是将三维世界中的事物投影到二维平面上,变为一张图片的形式。图像中包含了它所表达的事物的大部分信息,据有关资料表示,人类所获得的大部分信息来源于眼睛,也就是从图像中获得的。
数字图像的分类
数字图像在计算机中表示方法不同,分为二进制图像,索引图像,灰度图像,RGB图像和多帧图像;
数字图像的产生
数字图像的产生主要通过两种方式,一种是通过像数码照相机这样的设备直接拍摄得到数字图像,还有一种是通过图像采集卡、扫描仪等数字化设备,将模拟图像转变为数字图像。
1.1.4数字图像处理的研究内容
1) 图像运算与变换
2) 图像增强
3) 图像复原
4).图像的锐化处理及边缘检测
5) 图像分割
6) 图像编码压缩
图像的表示方法
图像的表示方法是对图像处理算法描述和利用计算机处理图像的基础。一个二维图像,在计算机中通常为一个二维数组f (x, y),或者是一个M×N的二维矩阵(其中,M为图像的行数,N为图像的列数)
1 二进制图像
二进制图像也称为二值图像,通常用一个二维数组来描述,1位表示一个像素,组成图像的像素值非0即1,没有中间值,通常0表示黑色,1表示白色。二进制图像一般用来描述文字或者图形,其优点是占用空间少方便处理,缺点是只能描述边缘轮廓等无法显示其细节。
2 灰度图像
灰度图像也称为单色图像,通常也由一个二维数组表示一副图像,8位表示一个像素,0表示黑色,255表示白色,1~254表示不同的深浅灰色,一副灰度图像放大4×4大小像素,通常灰度图像显示了黑色与白色之间许多级的颜色深度,比人眼所能识别的颜色深度范围要宽的多。
3 RGB图像
RGB图像也称为彩色图像,利用3个大小相同的二维数组表示一个像素,3个数组分别代表R、G、B三个分量,R表示红色,G表示绿色,B表示蓝色,通过三种基本颜色可以合成任意颜色。每个像素中的每种颜色分量占8位,每一位由[0,255]中的任意数值表示,那么一个像素由24位表示,允许的最大值为224(即1677216,通常记为16M)。
4 索引图像
索引图像是一种把像素值直接作为RGB调色板下标的图像。在MATLAB中,索引图像包含一个数据矩阵X和一个颜色映射(调色板)矩阵map。数据矩阵可以是8位无符号整型、16位无符号整型或双精度类型的。
5 多帧图像
多帧图像是一种包含多幅图像或帧的图像文件,又称为多页图像或图像序列,主要用于需要对时间或场景上相关图像集合进行操作的场合。例如,计算机X线断层扫描图像或电影帧等
矩阵
矩阵用于描述图像,可以表示黑白图像、灰度图像和彩色图像。矩阵中的一个元素表示图像的一个像素。矩阵描述黑白图像时,矩阵中的元素取值只有0和1两个值,因此黑白图像又叫二值图像或二进制图像。矩阵描述灰度图像时,矩阵中的元素由一个量化的灰度级描述,灰度级通常为8位,即0~255之间的整数,其中0表示黑色,255表示白色。
二 计算机中图像文件格式
数字图像在计算机中存储的格式有多种多样,每一种文件格式都包括一个头文件和一个数据文件。头文件的内容由制作图像的公司规定,一般包括文件类型、制作时间,文件大小制作人及版本号等信息。文件制作时还涉及到图像的压缩和存储效率等。
BMP文件格式
BMP文件格式是Windows系统中的一种标准图像文件格式,支持 RGB、索引颜色、灰度和位图颜色模式。BMP文件一共有两种类型,设备相关位图(DDB)和设备无关位图(DIB)。Windows3.0以前的BMP文件格式与显示设备有关,因此把这种BMP文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式。BMP文件默认的文件扩展名是 .BMP或 .bmp。
GIF文件格式
GIF文件格式是CompuServe公司在 1987年开发的图像文件格式,任何商业目的使用均须由CompuServe公司授权。GIF文件主要是为数据流设计的一种传输格式,不作为文件的存储格式,它具有顺序的结构形式。GIF文件主要由五部分组成:文件标志块,识别标识符“GIF”和版本号;逻辑屏幕描述块,定义图像显示区域的参数,包含背景颜色信息、显示区域大小、纵横
尺寸、颜色深浅以及是否存在全局彩色表;全局彩色表,其大小由图像使用的颜色数决定;图像数据块,包含图像的描述块,局部彩色表,压缩图像数据,图像控制扩展块,无格式文本扩展块,注释扩展块,应用程序扩展块,此部分可以缺省;尾块,为三维16进制数,表示数据流已经结束,此部分可以缺省。
JPEG文件格式
JPEG是Joint Photographic Experts Group的缩写,即联合国图像专家组。作为一种图像文件格式,JPEG格式联合国图像专家组制定,文件扩展名 .jpg或 .jpeg。JPEG格式的图像文件具有迄今为止最为复杂的文件结构和编码方式,和其他格式的最大区别是JPEG使用一种有损压缩算法,是以牺牲一部分的图像数据来达到较高的压缩率,但是这种损失很小以至于很难察觉。JPEG格式又可分为标准JPEG、渐进式JPEG及JPEG2000三种格式,这三种格式的区别主要在Internet图像显示方式上。标准JPEG格式图像在网页下载时只能由上而下依序显示图像,直到图像全部下载完毕,才能看到全貌。渐进式JPEG格式可以在网页下载时,先呈现出图像的粗略外观后,再慢慢地呈现出完整的内容。JPEG2000格式是新一代的影像压缩法,压缩品质更好,并可改善无线传输时,常因讯号不稳造成马赛克及位置错乱的情况,改善传输的品质。
TIFF文件格式
TIFF格式最初由Aldus公司与微软公司一起为PostScript打印开发,是一种主要用来存储包括照片和艺术图在内的图像的文件格式,文件扩展名为 .tif 或 .tiff。TIFF文件格式主要包括三个部分:文件头,有固定的位置,位于文件的最前端,是文件中惟一的,包含一个标志参数指出标识信息区在文件中的存储地址及正确解释TIFF文件的其他部分所需的必要信息; 标识信息区,是用于区分一个或多个可变长度数据块的表,包含了有关于图像的所有信息。图像文件目录中提供了一系列的指针,这些指针指向各种有关的数据字段在文件中的初始地址,并给出每个字段的数据类型及长度;图像数据,根据图像文件目录所指向的地址存储相关的图像信息。

2020-03-20 17:38:52 weixin_45263626 阅读数 36
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2538 人正在学习 去看看 贾志刚

详情请参考https://book.openmv.cc/python-background.html 官方教程
https://docs.singtown.com/micropython/zh/latest/openmvcam/index.html 官方函数库
此处仅作备忘录,官方文档已经非常详尽了。

——

前言

openmv算是我第一次接触到的图像处理入门设备,对于专业不涉及图像处理领域,但是需要应用相关功能的人来说,这小玩意算是物超所值,学习成本很低(相比树莓派+摄像头),你要做的只是熟悉一下mircopython语法。
想来openmv接触了有一个月(我觉得挺长了),也实现了不少小功能(可惜只是用了裸机操作)。 这篇文章算是对openmv的回顾,因为有相当一段时间没摸它了,毕竟花了这么常时间研究它,怕把这些经验遗忘了。

基础内容

在开始之前请先注意,openmv和opencv是两个完全不同的概念,几乎不存在相互移植的可能性。

openmv简介

openmv是一个可以通过MicroPython语言进行编程的摄像头(实际上也只能使用MicroPython,并不能使用C语言,但是其运算速度是可以忍受的),内置了一些图像处理算法,使用时可以直接调用库实现功能,所有的功能基本上都是通过堆叠库实现的。
openmv通常用于DIY相关的项目制作(也就是说适合学生和爱好者)。

openmv的选购
尽可能选择OPENMV3 M7摄像头及以上版本的(如果出了的话),这是因为stm32系列处理图像能力有限,低版本会有很多功能无法实现,掉帧情况也会变得难以忍受。
使用时请支持正版,低于正常价格的产品可能会影响功能的实现。

openmv的功能

openmv常用的功能有板级控制(略去不讲,但很重要)、画图(drawing)、图像滤波(image-filters)、拍摄(snapshot)、特征检测(feature-detection)、颜色追踪(color-tracking)、codes、测距等。

mircopython

python是面向对象的图形语言(c语言是面向过程)。Python 的发展以 CPython 为主,MicroPython 和 CPython 在 Python3 语法上保持高度的一致性,包含Python标准库的一小部分,但常用的标准语法命令都已经支持。相比于python,mircopython通常用于资源有限的嵌入式设备。
对mircopython的学习点到即止,因为它不是用于嵌入式开发的常用语言。

OV摄像头

omnivision简称OV,美商半导体公司,中文名豪威科技,专业开发高度集成CMOS影像技术。openmv3采用OV7725 sensor。

图像处理

在与颜色处理有关的功能实现中,openmv使用的就是LAB模式或灰度模式。
LAB模式
Lab颜色空间中,L代表亮度;a的正数代表红色,负端代表绿色;b的正数代表黄色,负端代表兰色。因此L分量可以调整亮度对,修改a和b分量的输出色阶来做精确的颜色平衡。
在这里插入图片描述
噪声
噪声即噪点,是图像中一种亮度或颜色信息的随机变化,而被拍摄物体本身并没有,这给图像带来了错误和额外的信息。

图像处理算子
数学中的映射,当映射的作用是把函数映成函数,或者函数映成数的时候,这个映射常常叫做算子.图像处理里都把图像看成R²上的函数,每个像素只是这个函数的采样点。在这个意义下,算子就是把一个R²上的函数变化到另一个R²上的函数的一个变换。

图像滤波

总结自 http://www.ruanyifeng.com/blog/2017/12/image-and-wave-filters.html 图像与滤波 阮一峰
简洁明了。

图像本质上就是各种色彩波的叠加,可以用波的算法处理图像。色彩剧烈变化的地方,就是图像的高频区域;色彩稳定平滑的地方,就是低频区域。通过使用滤波器(filter)可以过滤掉某些波,保留另一些波。

通用配置

此处为常用功能都会涉及的通用设置。

感光元件配置

需引用sensor模块,用于设置感光元件的参数。

import sensor#引入感光元件的模块

# 设置摄像头
sensor.reset()#初始化感光元件
sensor.set_pixformat()#设置像素模式,括号内可选sensor.GRAYSCALE: 灰度or sensor.RGB565: 彩色
sensor.set_framesize()#设置图像的大小
sensor.set_auto_gain()#自动增益开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动增益。
sensor.set_auto_whitebal()#自动白平衡开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动白平衡。
sensor.skip_frames()#跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。

其中图像大小可设置为:
sensor.QQQVGA: 80×60
sensor.QQVGA: 160x120
sensor.HQVGA: 240x160
sensor.QVGA: 320x240
sensor.VGA: 640x480 (只用于OpenMV Cam M7 的灰度图处理图像,或者彩图采集图像)

图像处理要实现的功能越复杂,分辨率就要设置的越低,或者切换为灰度模式,以此来提高帧数。

拍摄(snapshot)

img = sensor.snapshot()#image=img
sensor.snapshot().save("example.jpg") # or "example.bmp" (or others)
#需要SD卡

ROI(region of interest)

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。

ROI=(x0,y0,x1,y1)#设置roi位置
img.draw_rectangle(ROI)#在图像中标注感兴趣区域

帧率显示(fps)

需引入time模块

clock = time.clock()                # Create a clock object to track the FPS.返回一个时钟对象
#初始化时钟
clock.tick()                    # Update the FPS clock.开始追踪运行时间
print("FPS:", clock.fps())#可输出帧率.停止追踪运行时间,并返回当前FPS

也可以直接在图像中显示帧率。
注意: 当连接电脑后,OpenMV会变成一半的速度。当不连接电脑,帧率会增加。

阈值(thresholds)

阈值有LAB阈值和灰度阈值。
OpenMV 的IDE里加入了阈值选择工具(位于 工具 → Mechine Vision → Threshold Editor ,选中 Frame Buffer可以获取IDE中的图像)来确定阈值。使用方法为拖动六个滑块,将目标颜色变成白色,其他颜色全变为黑色。
阈值的格式为:

rgb = (minL, maxL, minA, maxA, minB, maxB)#彩色
grayscale = (min,max)

镜头畸变矫正(lens correction)

img.lens_corr(1.8) # strength of 1.8 is good for the 2.8mm lens.
#或者
 img = sensor.snapshot().lens_corr(strength = 1.8, zoom = 1.0)#二者纯粹是语法上的差异

用于扫码,形状识别等。

具体功能的实现

某些函数省略了不常用的参数设置,详情请参考官方函数库文档。

画图(drawing)

实现此功能需引入image(机器视觉)模块。
常用的可绘制图形有箭头arrow、圆形circle、十字cross、线段line、矩形rectangle、文字text

image.draw_xxx(x0, y0, x1, y1, color) #颜色可以是灰度值(0-255),或者是彩色值(r, g, b)

图像滤波(image filters)

实现此功能需引入image(机器视觉)模块。

二值化( Image Binarization)

注意与灰度化的区分。

在数字图像处理中,二值图像占有非常重要的地位,图像的二值化使图像中数据量大为减少,从而能凸显出目标的轮廓。
分为颜色二值化灰度二值化

img.binary([threshold])#二值化分割
BINARY_VISIBLE = True or False #设置是否使用img.binary()函数进行图像分割
img = sensor.snapshot().binary([THRESHOLD]) if BINARY_VISIBLE else sensor.snapshot()#用来切换二值化视角或彩色/灰度视角

边缘检测(edge detection)

利用morph算子实现快速边缘检测,速度慢但效果好。

#设置核函数滤波,核内每个数值值域为[-128,127],核需为列表或元组
kernel_size = 1 # kernel width = (size*2)+1, kernel height = (size*2)+1
kernel = [-1, -1, -1,\
          -1, +8, -1,\
          -1, -1, -1]
img.morph(kernel_size, kernel)

在OV7725 sensor上, 边缘检测可以通过设置sharpness/edge寄存器来增强。

侵蚀函数

img.erode(1, threshold = 2)
    #侵蚀函数erode(size, threshold=Auto),去除边缘相邻处多余的点。threshold
    #用来设置去除相邻点的个数,threshold数值越大,被侵蚀掉的边缘点越多,边缘旁边白色杂点越少
  

快速边缘检测(feature Detection edges)

利用canny算子实现快速边缘检测,编程非常简单,速度快但效果差。

 img.find_edges(image.EDGE_CANNY, threshold=(a,b))

特征检测(feature detection)

特征检测应用较多的有图形检测,如识别圆、识别线段、识别直线、识别矩形。应用上通常把特征检测和颜色追踪结合起来,并通过绘图将检测到的图形在图像中标出。
实现此功能需引入image(机器视觉)模块。

图形检测

通常是用霍夫变换完成的。

 for c in img.find_circles(threshold = 3500, x_margin = 10, y_margin = 10, r_margin = 10,r_min = 2, r_max = 100, r_step = 2): #threshold 控制从霍夫变换中监测到的圆,只返回大于或等于阈值的圆
 						#x/y/r_margin 控制所检测的圆的合并;
					 #r_min,r_max和r_step控制测试圆的半径,缩小测试圆半径的数量可以大大提升性能
        img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0)) #找到图像中所有的圆

线段
相比寻找无限长的直线,速度降低不少。

直线
霍夫变换将二维空间中所有的直线映射到以theta&rho为坐标轴的二维空间中,theta代表直线与Y轴负方向的夹角,以Y轴负轴为起始轴,逆时针旋转到直线的角度。rho表示原点到直线的距离,Y轴截距大于0的均为正,Y轴截距小于0则rho为负。

min_degree = 
max_degree =

for l in img.find_lines(threshold = 1000, theta_margin = 25, rho_margin = 25):
        if (min_degree <= l.theta()) and (l.theta() <= max_degree):
            img.draw_line(l.line(), color = (255, 0, 0))

矩形

for r in img.find_rects(threshold = 10000):
        img.draw_rectangle(r.rect(), color = (255, 0, 0))
        for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0)) #标注4个角

rect.corners()
返回一个由矩形对象的四个角组成的四个元组(x,y)的列表。四个角通常是按照从左上角开始沿顺时针顺序返回的。

线性回归(linear regression)

线性回归分为鲁棒线性回归(linear regression robust)和快速线性回归(linear regression fast)。线性回归通常用于机器人巡线。快速线性回归的原理是使用最小二乘法来拟合线。

line = img.get_regression(threshold, robust = True or False) #robust为1时开启鲁棒线性回归
if (line): img.draw_line(line.line(), color ) #标注检测出的直线

颜色追踪(color-tracking)

实现此功能需引入image(机器视觉)模块。

单色识别

分为单灰度识别和单彩色识别。

for blob in img.find_blobs([threshold])

多颜色识别

for blob in  img.find_blobs([threshold0,threshold1,threshold2,...]) #最多有16个阈值

codes

使用前需进行镜头畸变矫正。
可测量条形码barcodes、二维码qrcodes、矩形码datamatrices等。
条形码的代码相对复杂很多,最简单的时二维码。

 for code in img.find_qrcodes(): #识别二维码
        img.draw_rectangle(code.rect(), color = (255, 0, 0))
        print(code)

测距

虽然可以使用Apriltag进行3D定位,但通常情况下我们只能使用裸机测距(特别是距离目标物较远时,低成本测距传感器将无法派上用场)。
OpenMV采用的是单目摄像头,需要利用参照物的大小比例来计算距离。
其公式为:距离 = 一个常数/直径的像素
该常数的测量方法为:让被测物距离摄像头 n cm,打印出摄像头里直径的像素值,然后相乘,就得到了常数的值。

先这样,有空再继续补充。

2017-05-18 17:49:18 u013828589 阅读数 11916
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2538 人正在学习 去看看 贾志刚

图像处理基础知识总结(1)

前言:从接触图像处理、生物特征识别、视频编解码、机器学习已两年有余,还没有系统的总结过,正好最近刷一下Tsinghua的Tipa课件和PKU的Digital Image Processing,对以前的图像处理基础知识做一些回顾,整理成笔记形式,代码和示例基于matlab给出。主要包含内容:

  • 原理总结
  • 部分matlab实现
  • matlab源代码解析

1.图像坐标变换

  • 旋转
  • 尺度(缩放)
  • 平移
  • 错切
  • 反射
  • 投影
  • 反变换

1.1 旋转

原理

绕原点逆时针旋转θ度角的变换公式是x′=x cosθ − ysinθ与y′=xsinθ+ycosθ,在二维空间中用矩阵表示为:
cmd-markdown-logo

但是为了可以表示仿射变换,需要使用齐次坐标,常见的矩阵变化都是在三维下进行的,在矩阵中增加一列与一行,除右下角的元素为1外其它部分填充为0,通过这种方法,所有的线性变换都可以转换为仿射变换。此时旋转矩阵如下所示

logo

仿射变换:包含平移及线性映射,为了使矩阵乘法可同时实现这两个功能,需要所有向量在其末端扩长 “1”且所有矩阵都于底部添加一排零,右边扩长一列转换向量,及右下角添加一个 “1”。
注:仿射变换具体请参考:wiki_仿射变换

MATLAB 实现

利用花花公子杂志上的Lean的部分图像进行示例(-.- 关键部分都被数字图像处理的作者们截掉了,只有一张lean的脸保留了下来。。。。天真的我),matlab中图像旋转很简单,调用imrotate函数即可

clc;clear;close all;
%% image rotate
img = imread('/Users/Documents/MATLAB/lena.jpg');
rotateImg = imrotate(img,30); 
figure;
subplot(1,2,1),imshow(img);
subplot(1,2,2),imshow(rotateImg);

效果如下:可以看到图像逆时针旋转了30度
cmd-markdown-logo

简单解析

打开matlab中imrotate函数源码,在命令行敲

type imrotate

找出关键信息可以看到,图像旋转利用矩阵旋转实现,旋转矩阵为tform

tform = affine2d([cosd(ang) -sind(ang) 0; sind(ang) cosd(ang) 0 ; 0 0 1])
B = imwarp(A,tform,method,'OutputView',Rout, 'SmoothEdges',true);

1.2 尺度(缩放)

基于上文,即坐标变换通常3x3大小的矩阵完成,对矩阵中的每一点生成[x,y,1]三维向量与变换矩阵相乘,便得到新矩阵,大多数图像几何变换都基于矩阵完成,用字母表示为从A到I,如下图。
cmd-markdown-logo
则对于缩放有
cmd-markdown-logo

1.3 平移

cmd-markdown-logo

1.4 错切

错切常分为x轴错切或者y轴错切,平行于x轴的切变为x′=x+ky与y′=y,
平行于y轴的切变为x′=x与y′=y+kx,矩阵实现参考下图

cmd-markdown-logo

1.5 反射

二维反射变换如下,三维的基于上文变为增广矩阵即可。
cmd-markdown-logo

1.6 投影

cmd-markdown-logo

1.7 反变换

cmd-markdown-logo
cmd-markdown-logo

2.像素、邻域、距离

像素

像素定义类似与眼球的杆状体,每张图片都是像素点的集合,常见的显示器描述就是以像素为单位,例如”640乘480”,它有横向640像素和纵向480像素(就像VGA显示器那样),因此其总数为640 × 480 = 307,200像素(30.72万像素)。
数字图像均由像素点构成,依据坐标原点位置的不同常分为两类,每个像素点标示为I(r,c)或f(x,y)。
**灰度图像的值域I是一个一元标量: I=greylevel
彩色图像的值域I是一个多元向量: 如I=(r,g,b)**

img

每一个像素所能表达的不同颜色数取决于比特每像素(BPP,bit per pixel)。这个最大数可以通过取2的色彩深度次幂来得到。例如,常见的取值有
8 bpp:256色,亦称为“8位”;
16 bpp:216=65,536色,称为高彩色”;
24 bpp:224=16,777,216色,称为真彩色,亦称为“24位色”;
32 bpp:224 +28,电脑领域较常见的32位色并不是表示232种颜色,而是在24位色基础上增加了8位(28=256级)的灰阶,因此32位的色彩总数和24位是相同的,32位也称为全彩。
(注:对于超过8位的深度,这些数位就是三个分量(红绿蓝)的各自的数位的总和。一个16位的深度通常分为5位红色和5比特蓝色,6比特绿色。24位的深度一般是每个分量8位。
一张普通图片的像素点如下图所示:

cmd-markdown-logo

注:
1.用matlab以矩阵形式读入即可查看图片属性,常见为8位灰度或者3通道RGB24位彩色图
2.人眼只能分辨1000种颜色

邻域

2.2.1. 4邻域

像素p(x,y)的4邻域是:(x+1,y);(x-1,y);(x,y+1);(x,y-1)
用N4(p)表示像素p的4邻域

2.2.2. D邻域

像素p(x,y)的D邻域是:(x-1,y-1);(x-1,y+1);(x+1,y+1);(x+1,y-1)
用ND(p)表示像素p的D邻域

2.2.3. 8邻域

4邻域的点+ D邻域的点
用N8p表示像素p的8邻域
N8p = N4p + NDp

2.2.4. 连通性

对于灰度值在V中的像素p和q,如果q在集合
N4p中,则称这两个像素是4连通的,8联通与此类似

距离

像素间的距离分为三种
- 欧几里得距离(Euclidean distance)
- D4距离或城市距离(Manhattan distance)
- D8距离或棋盘距离(Chessboard distance)

2.3.1. 欧式距离

在欧氏距离定义下,具有与(x,y)距离小于等于某 个值r的像素是:包含在以(x,y)为圆心,以r为半 径的圆.像素p(x,y)和q(s,t)间的欧氏距离定义如下

2.3.2 城市距离

像素p(x,y)和q(s,t)间的城市距离定义如下:

具有D4 = 1的像素是(x,y)的4邻域,具有与(x,y)距离小于等于某个值r的那些像素形成直角菱形

2.3.3 棋盘距离

像素p(x,y)和q(s,t)间的 D8距离定义如下:

具有与(x,y)距离小于等于某个值r的那些像素形成正方形,具有D8 = 1的像素是(x,y)的8邻域

2.3.4 路径

一条从具有坐标(x,y)的像素p,到具有坐标(s,t)的像素q的路径,是具
有坐标(x0,y0),(x1,y1),…,(xn,yn)的不同像素的序列。
其中,(x0,y0) = (x,y),(xn,yn) = (s,t),(xi,yi) 和(xi-1,yi-1)是邻接的,1
≤ i ≤ n,n是路径的长度。
如果(x0,y0) = (xn,yn) ,则该路径是闭合路径。
可以用定义连通的类似方法定义4-路径和8-路径。

3.图像显示

抖动技术

误差抖动常用在图像/视频压缩中,用来降低色彩的深度。如下图所示,256级(8bit)灰度过度 【图二】将图一转换成16级(8bit)灰度(高4位不变,低4位置0) 【图三】将图一用误差扩散法转换成16级灰度。
可看出图3效果好于图2

4.采样与量化

大多数传感器(如CMOS)的输出是连续信号波形,为了产生一幅数字图像,需要把连续的感知数据转化为离散的数字形式,这包括两种处理:取样和量化
- 取样(Sampling):图像函数定义域(空间坐 标)的数字化
- 量化(Quantization):图像函数值域(灰度值) 的数字化

4.1 采样

采样通常为求每个像素对应区域内的积分均值,实际中,模拟信号都是电流\电压值,经过A/D转换为数字信号,具体可参考VB工业编程。

采样点越多,数据量越多,图像越清晰

4.2量化

量化常分为2^m,m=8最常见,即把模拟信号最大最小值中分段量化

量化阶数越高,视觉效果越好

5.图像质量

  • 亮度
  • 对比度(最大亮度/最小亮度)
  • 尺寸大小
  • 细微层次(模糊)
  • 颜色饱和度

6.图像存储与格式

(1) BMP(BitMaP)格式
(2) GIF(Graphics Interchange Format)格式
(3) TIFF(Tagged Image Format File)格式
(4) JPEG(Joint Photographic Expert Group)格式

关于图像存储与格式,需要大篇篇幅去论述,通常分为head和data两部分,在开发中不会过多涉及格式问题,因此不再详细叙述,知识总结1就先写到这里,莫名累。。。。。

参考链接

wiki-变换矩阵
wiki-像素
pku-cys
Tsinghua-Tipa

作者:@Awiny

2018-08-16 22:54:17 Eastmount 阅读数 13585
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2538 人正在学习 去看看 贾志刚

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

该系列在github所有源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,以后会分享更多代码,一起加油。

同时推荐作者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像增强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解

本篇文章作为第一篇,将讲解图像处理基础知识和OpenCV入门函数,知识点如下:
1.图像基础知识
2.OpenCV读写图像
3.OpenCV像素处理

PS: 文章也学习了网易云高登教育的知识,推荐大家学习。

PSS:2019年1~2月作者参加了CSDN2018年博客评选,希望您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index

五年来写了314篇博客,12个专栏,是真的热爱分享,热爱CSDN这个平台,也想帮助更多的人,专栏包括Python、数据挖掘、网络爬虫、图像处理、C#、Android等。现在也当了两年老师,更是觉得有义务教好每一个学生,让贵州学子好好写点代码,学点技术,"师者,传到授业解惑也",提前祝大家新年快乐。2019我们携手共进,为爱而生。

一.图像基础知识

图像都是由像素(pixel)构成的,即图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。

图像通常包括二值图像、灰度图像和彩色图像。

1.二值图像
二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。

2.灰度图像
灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:
(1) 浮点算法:Gray=R0.3+G0.59+B0.11
(2) 整数方法:Gray=(R
30+G59+B11)/100
(3) 移位方法:Gray=(R28+G151+B77)>>8;
(4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
(5) 仅取绿色:Gray=G;
(6) 加权平均值算法:根据光的亮度特性,公式: R=G=B=R
0.299+G*0.587+B0.144

通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。改变象素矩阵的RGB值,来达到彩色图转变为灰度图。

3.彩色图像
彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。



二.OpenCV读写图像

本文主要使用Python2.7和OpenCV进行讲解,首先调用"pip install opencv-python"安装OpenCV库,如下图所示:

1.读入图像
OpenCV读图像主要调用下面函数实现:

img = cv2.imread(文件名,[,参数])
参数(1) cv2.IMREAD_UNCHANGED (图像不可变)
参数(2) cv2.IMREAD_GRAYSCALE (灰度图像)
参数(3) cv2.IMREAD_COLOR (读入彩色图像)
参数(4) cv2.COLOR_BGR2RGB (图像通道BGR转成RGB)

2.显示图像
显示图像调用函数如下:

cv2.imshow(窗口名, 图像名)

3.窗口等待
调用函数如下:

cv2.waitKey(delay)
键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。

4.删除所有窗口
调用函数如下:

cv2.destroyAllWindows() 删除所有窗口
cv2.destroyWindows() 删除指定的窗口

5.写入图片
调用函数如下:

retval = cv2.imwrite(文件地址, 文件名)

下面代码是读入图片并显示保存。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg")

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

输出结果如下图所示,并且在文件夹下保存了一张名为“testyxz.jpg”的图像。

如果代码中没有watiKey(0)函数,则运行结果如下图所示:

同时
可以对代码进行升级,如下所示:

#无限期等待输入
k=cv2.waitKey(0)
#如果输入ESC退出
if k==27:
    cv2.destroyAllWindows()


三.OpenCV像素处理

1.读取像素
灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。注意OpenCV读取图像是BGR存储显示,需要转换为RGB再进行图像处理。

灰度图像:返回值 = 图像(位置参数)
eg: test=img[88,42]
彩色图像:返回值 = 图像[位置元素, 0 | 1 | 2 ] 获取BGR三个通道像素
eg: blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]

2.修改图像
修改图像如果是灰度图像则直接赋值新像素即可,彩色图像依次给三个值赋值即可。

灰度图像:
img[88,142] = 255
彩色图像:
img[88,142, 0] = 255
img[88,142, 1] = 255
img[88,142, 2] = 255
彩色图像:方法二
img[88,142] = [255, 255, 255]

下面代码是获取像素及修改的操作。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
test = img[88,142]
print test
img[88,142] = [255, 255, 255]
print test

#分别获取BGR通道像素
blue = img[88,142,0]
print blue
green = img[88,142,1]
print green
red = img[88,142,2]
print red

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

输出结果如下所示:
[158 107 64]
[255 255 255]
255
255
255

下面代码是将行为100到200、列150到250的像素区域设置为白色。

# -*- coding:utf-8 -*-
import cv2

#读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)

#该区域设置为白色
img[100:200, 150:250] = [255,255,255]

#显示图像
cv2.imshow("Demo", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

#写入图像
cv2.imwrite("testyxz.jpg", img)

运行结果如下图所示:

希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。
(By:Eastmount 2018-08-16 夜11点 https://blog.csdn.net/Eastmount/

2019-09-16 19:50:37 qq_43163608 阅读数 214
  • OpenCV4 图像处理与视频分析实战教程

    基于OpenCV最新版本OpenCV4开始,从基础开始,详解OpenCV核心模块Core、Imgproc、video analysis核心API 与相关知识点,讲解从图像组成,像素操作开始,一步一步教你如何写代码,如何用API解决实际问题,从图像处理到视频分析,涵盖了计算机视觉与OpenCV4 中主要模块的相关知识点,穿插大量工程编程技巧与知识点与案例,全部课程的PPT课件与源码均可以下载。部分课程内容运行截图:

    2538 人正在学习 去看看 贾志刚

写在前面:本人是非计算机专业的学生,但是在课余学习的时候对图像处理产生了一些兴趣,总觉得大学四年不能总是局限于本专业的知识,想着要了解其他领域感兴趣的方面,就打算开始看数字图像处理的书籍,并且在csdn博客上记录自己的笔记,以期望之后能回顾。可能因为自己是非计算机专业的,对于知识的理解也许不是那么到位。
图像处理是指用计算机对图像进行分析,以达到某种效果或目的。在目前的智能领域,图像处理广泛应用,例如人脸识别,车牌识别等。

数字图像的概念

一幅图像我们可以看做是一个二维函数f(x,y),其中x,y是平面的坐标位置,幅值f为对应每个坐标位置的灰度或强度。而为了方便最图像进行直观的处理,我们需要将图像转化为数字形式,成为一幅数字图像,其中所涉及的的操作有两个部分:取样和量化。
坐标x,y可以定位图像的某个位置,但是一幅图像的x,y和f可能都是连续的,我们需要对其取样,所以将坐标数字化称为取样,将幅值f数字化称为量化。数字图像的质量很大程度上取决于样本数和灰度级,样本数越大,图像质量就越好,不容易出现马赛克现象;量化等级越多,所呈现的图像的层次性越好,灰度分辨率越高。
我们将连续图像取样为一个二维阵列f(x,y),那么图像就可以用矩阵来表示,该矩阵包含M行和N列,(x,y)即为图像坐标。二维阵列函数
其中,图像在任何(x,y)坐标下的值为f(x,y),第一行第一列对应的值为f(0,0),为数字图像的原点,实际上矩阵中的每个元素就是像素。或者我们也可以用传统的矩阵表示方法来表示数字图像:
传统矩阵表示
我们注意到数值图像的原点都是位于左上角,这是因为大多数显示器的扫描都是从左上角开始的,将它作为原点也就顺理成章,这也符合数学上矩阵元素的表达方式。
在数字化过程中,我们需要对行M,列N和灰度级数L作出规定,M,N只需是正整数就可以,但为了存储的需要,L值必须为2的整数次幂:L=2kL = 2^k.我们将灰度离散区间设为[0,L-1],当k=1时,L=2,即图像有两个灰度级数,这也就是我们所见的二值图像,俗称黑白图像。当一幅图像有 2^k个灰度级数时,通常称该图像为一幅“K”比特图像。例如8比特图像有256个离散灰度值。

没有更多推荐了,返回首页