当前位置:   article > 正文

图像处理--OpenCV学习笔记

opencv学习笔记
内容简介

OpenCV是应用广泛的开源图像处理库,包括基本的图像处理方法:几何变换,形态学变换,图像平滑,直方图操作,模板匹配,霍夫变换;特征提取和描述方法:理解角点特征,Haeeis和Shi-Tomes算法,SIFT.SURF算法,Fast算法,ORB算法;以及openCV在视频操作中的应用,最后实践案例为人脸检测。

图像起源

图像是人类视觉的基础,是自然景物的客观反映。“图”是物体反射或透射光的分布,“像”是人的视觉系统所接受的图在人脑中所形成的印象或认识。

模拟图像和数字图像

模拟图像由某种物理量(光,电)的强弱变化来记录图像亮度信息,所以是连续变化的,易受干扰,已被数字图像替代。
数字图像:亮度由离散数值表示,是二维图像用有限数字数值像素的表示。分类有:二值图像,灰度图,彩色图。

二值图像

一维二值图像的二维矩阵仅由0,1两个值构成,“0”代表黑色,“1”代表白色。每个像素取值有0,1两种可能,所以计算机中二值图像的数据类型通常为一个二进制位。二值图通常用于文字,线条图和扫描识别(OCR)和掩膜图像的存储。

灰度图

。灰度数字图像是每个像素只有一个采样颜色的图像。. 这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。. 灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度

索引图像

索引图像的文件结构比较复杂,除了存放图像的二维矩阵外,还包括一个称之为颜色索引矩阵MAP的二维数组。MAP的大小由存放图像的矩阵元素值域决定,如矩阵元素值域为[0,255],则MAP矩阵的大小为256Ⅹ3,用MAP=[RGB]表示。MAP中每一行的三个元素分别指定该行对应颜色的红、绿、蓝单色值,MAP中每一行对应图像矩阵像素的一个灰度值,如某一像素的灰度值为64,则该像素就与MAP中的第64行建立了映射关系,该像素在屏幕上的实际颜色由第64行的[RGB]组合决定。也就是说,图像在屏幕上显示时,每一像素的颜色由存放在矩阵中该像素的灰度值作为索引通过检索颜色索引矩阵MAP得到。索引图像的数据类型一般为8位无符号整型(unsigned int8),相应索引矩阵MAP的大小为256Ⅹ3,因此一般索引图像只能同时显示256种颜色,但通过改变索引矩阵,颜色的类型可以调整。索引图像的数据类型也可采用双精度浮点型(double)。索引图像一般用于存放色彩要求比较简单的图像,如Windows中色彩构成比较简单的壁纸多采用索引图像存放,如果图像的色彩比较复杂,就要用到RGB真彩色图像。

彩色图

每个像素通常由红,绿,蓝,三个分量来表示的。分量介于(0,255).RGB图像与索引图像一样都可用来表示彩色图像。与索引图象一样,由R,G,B三种颜色组合来表示每个像素的颜色。但与索引图像不同的是,RGB图像每一个像素的颜色值直接存放在颜色矩阵中,由于每一像素的颜色由RGB三个分量表示,M,N分别表示图像的行列数,三个M*N的二维矩阵分别表示每个像素的R,G,B三个颜色分量。RGB图像的数据类型一般为8位无符号整型,通常用于表示和存放真彩色图像。

OpenCV

计算机视觉开源软件库,支持与计算机视觉和机器学习的众多算法,并日益扩展。

优势

1:基于C++实现,提供python,ruby,matlab等语言接口。OpenCV-python是OpenCV的python API,结合OpenCV C++ API和python语言特性。
2:可以在不同系统平台上进行使用,包括Windows,Linux,OS X,Android和IOS.
3:丰富的API,完善的传统计算机视觉算法,涵盖主流的机器学习算法,同时添加了对深度学习的支持。

OpenCV-python

是一个python绑定库,旨在解决计算机视觉问题。
python语言简单易读,速度较慢。python使用c\c++扩展,在c/c++中编写计算密集型代码,并创建用作python的python包装器。好处是运行速度依旧很快,以及编写代码容易。
OpenCV-Python使用Numpy,这是一个高度优化的数据库操作库,具有MATLAB风格的语法。所有的OPENCV数组结构都转化为Numpy数组,与其他库集成更容易。

OPENCV模块

core :最核心的模块
highgui:视频与图像的读取,显示,存储
imgproc:图像处理的基础方法
features2d:图像特征以及特征匹配

OPENCV基本操作

读取图像:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
#读取图片
imge=cv.imread('E:\\code-python\\pythonProject1\\1.jpg',1)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

显示图像:

cv.imshow("image",imge)
  • 1

显示图像之后调用

cv.waitKey(0)
  • 1

给图像绘制留下时间,否则窗口会出现无响应情况,图像也无法显示出来。
也可使用matplotlib来进行展示

plt.imshow(imge[:,:,::-1])
  • 1

以灰度图形式进行保存

plt.imshow(imge,cmap=plt.cm.gray)
  • 1

图像保存:

#图像保存
cv.imwrite("E:\\code-python\\pythonProject1\\1.png",imge)
  • 1
  • 2

绘制几何图形
绘制直线:

cv.line(img,start,end,color,thickness)
#       图像,起点,终点,颜色,线条宽度
  • 1
  • 2

绘制圆形:

cv.circle(img,centerpoint,r,color,thinkness)
# 图像,圆心,半径,颜色,线条宽度,为-1时生成闭合图案并填充颜色。
  • 1
  • 2

绘制矩形:

cv.rectangle(img,leftupper,rightdown,color,thinkness)
#图像,左上角,右下角,颜色,宽度
  • 1
  • 2

添加文字:

cv.putText(img,text,station,font,fontsize,color,thinkness,cv.LINE_AA)
#图像,文本数据,文本放置位置,字体,大小
  • 1
  • 2

效果显示:

import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
#创建一个空白的图像
img = np.zeros((512,512,3),np.uint8)
#绘制图形
cv.line(img,(0,0),(511,511),(255,0,0),5)
cv.rectangle(img,(384,0),(510,128),(0,255,0),3)
cv.circle(img,(447,63),63,(0,0,255),-1)
font=cv.FONT_HERSHEY_SIMPLEX
cv.putText(img,'OpenCV',(10,500),font,4,(255,255,255),2,cv.LINE_AA)
#图像展示
plt.imshow(img[:,:,::-1])
plt.title('匹配结果'),plt.xticks([]),plt.yticks([])
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述
获取像素点:
可以通过行和列的坐标获得该像素点的像素值。对于BGR图像,它返回一个蓝,绿,红值的数组。对于灰度图像,仅返回相应的强度值。使用相同的方法对像素进行修改。

import numpy as np
import cv2 as cv
img=cv.imread('E:\\code-python\\pythonProject1\\1.jpg')
#获取像素点的值
px=img[100,100]
#仅获取蓝色通道的强度值
blue=img[100,100,0]
#修改某个位置的像素值
img[100,100]=[255,255,255]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

获取图像属性:
形状:img.shape
图像大小:img.size
数据类型:img.dtype

print(img.shape)
print(img.dtype)
print(img.size)
  • 1
  • 2
  • 3

图像通道的拆分与合并:

b,g,r=cv.split(img)
img=cv.merge((b,g,r))
  • 1
  • 2

色彩空间的改变:

cv.cvtColor(input_image,flag)
gray=cv.cvtColor(dili,cv.COLOR_BGR2GRAY)
plt.imshow(gray,cmap=plt.cm.gray)
  • 1
  • 2
  • 3

OPENCV算数操作

图像的加法:
可以使用OpenCV的cv.add函数把两个图像相加,或者可以简单的通过numpy操作添加两个图像,如res=img1+img2,两个图象应该具有相同的类型和大小,或者第二个图像为标量值。
注意:OpenCV加法和numpy加法之间存在差异。OpenCV的加法为饱和操作,而Numpy操作为模操作。
具体如下:

x=np.uint8([250])
y=np.uint8([10])
print(cv.add(x,y))#250+10=260=>255
print(x+y)#250+10=260%256=4
  • 1
  • 2
  • 3
  • 4

图像的混合:
按照不同的权重进行加法,会给人一种混合或者透明的感觉。公式如下:
g(x)=(1-a)f0(x)+af1(x)a取值为(0->1)

img1=cv.imread('E:\\code-python\\pythonProject1\\picture\\1.jpg',1)
img2=cv.imread('E:\\code-python\\pythonProject1\\picture\\2.jpg',1)
img3=cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow("img3",img3)
cv.waitKey(0)
  • 1
  • 2
  • 3
  • 4
  • 5

OPENCV图像处理

几何变换
图像缩放,平移
#获取行数列数
rows,cols=img1.shape[:2]
#绝对尺寸
res=cv.resize(img1,(2*cols,2*rows),interpolation=cv.INTER_CUBIC)
#相对尺寸
res1=cv.resize(img1,None,fx=0.5,fy=0.5)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
plt.imshow(img1[:,:,::-1])
plt.show()
rows,cols=img1.shape[:2]
res=cv.resize(img1,(2*cols,2*rows))
plt.imshow(res[:,:,::-1])
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

图像平移;

cv.warpAffine(img,M,dsize)
            图像,矩阵,大小
  • 1
  • 2

图像显示:
M为一个2*3的变换矩阵
M = [[x,y,z],[x1,y1,z1]]
M = np.float32([[1,0,100], [0,1,100]])
z为以左上角为坐标原点的x,z1为左上角为坐标原点的y,将图片进行平移
图片向x,y轴方向平移100距离

M=np.float32([[1,0,100],[0,1,100]])
res2=cv.warpAffine(img1,M,(cols
  • 1
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/132633
推荐阅读
相关标签
  

闽ICP备14008679号