【图像处理】基本概念

11 篇文章 0 订阅
9 篇文章 0 订阅
  • 目录:
    • 1、什么是opencv,它有哪些优势?
    • 2、opencv 安装和环境配置
    • 3、了解数字图像的基本概念:像素、彩色图像、灰度图像、二值图像、图像算数操作
    • 4、练习numpy中array的基本操作
    • 5、练习图像的加载、保存、以及算术操作

一、什么是 opencv

​ OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

​ 优势:

计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:

​ 1、研究代码(慢,不稳定,独立并与其他库不兼容)

​ 2、耗费很高的商业化工具(比如Halcon)

​ 3、依赖硬件的一些特别的解决方案(比如[视频监控],制造[控制系统],医疗设备)这是如今的现状,而标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。

OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。右图为OpenCV与当前其他主流视觉函数库的性能比较。(摘自百度百科)

二、opencv 安装和配置

1. opencv-python的安装

​ 默认已经配置好了python环境和科学计算必要的包如numpy。python下opencv的安装相对比较简单,只需要在命令行输入以下指令即可自动安装最新版的opencv库

pip install opencv-python

​ 如果需要安装之前版本的opencv,可以到 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 这个链接下搜索opencv并下载对应的版本,之后 pip inseall + opencv-python***.whl 即可。

2. linux下 opencv c++版的安装

进入官网 : http://opencv.org/releases.html , 选择需要版本的 source , 下载

解压到需要安装的路径下

mkdir build # 创建编译的文件目录

cd build

cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..

make -j8  #编译

sudo make install #安装

安装完成之后通过查看opencv版本验证是否安装成功:

pkg-config --modversion opencv  

三、数字图像的基本概念

1、分辨率:

指单位区域内包含的像素数目。单位为像素/英寸(通用),简写为 ppi2.像素/厘米
常见的分辨率:

1.图像分辨率 

2.显示分辨率 

3.输出分辨率  

4.位分辨率
2、彩色图像(RGB):

自然界中几乎所有颜色都可以自红(Red,R)、 绿(Green,G)、蓝(Blue,B) 3种颜色组合,通常称它们为RGB三原色.
计算机显示彩色图像时采用最多的就是RGB模型。对于每个像素,通过控制R、G、B三原色的合成比例则可决定该像素的最终显示颜色。将一幅图像视为一个二维函数f(x,y)外,其中x和y是空间坐标,而在x-y平面中的任意一对空间坐标(x,y)上的幅值f称为该点图像的灰度、亮度或强度。此时,如果f(x,y)均为非负有限离散,则称该图像为数字图像〈位图〉。一个大小为M×N的数字图像是由M行N列的有限元素组成的,每个元素都有特定的位置和幅值,代表了其所在行列位置上的图像物理信息,如灰度和色彩等。这些元素称为图像元素或像素。

3、二值图像

每个像素只有黑、自两种颜色的图像称为二值图像。在二值图像中,像素只有 0和1两种取值,一般用0来表示黑色,用1表示白色。

4、灰度图像

在二值图像中进一步加入许多介于黑色与白色之间的颜色探度,就构成了灰度图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,每种灰度〈颜色深度〉称为一个灰度级,通常用L表示.在灰度图像中,像素可以取 O~L-1之间的整数值,根据保存灰度数值所使用的数据类型的不同,可能有256种取值或者2k种取值,当k=1时即退化为二值图像.

5、图像的算术操作

由上我们可以知道图像可以看做是一个二维函数f(x,y)在空间的坐标,也就是说,图像上每个点都可以用函数f(x,y)来显示出来,图像的算术操作是阵列操作,即在相对应的像素对之间执行。

4种算术操作表示为:

s(x, y) = f(x, y) + g(x, y);

d(x, y) = f(x, y) - g(x, y);

p(x, y) = f(x, y) × g(x, y);

v(x, y) = f(x, y) ÷ g(x, y);

处理图像:

1.利用带噪图像的相加(平均)进行降噪处理。

2.利用图像相减增强差别。

3.利用图像相乘和相除来校正阴影。

四、numpy的基本操作

由于图像可以看做三维矩阵(宽,高,通道数),这就可以用numpy来对图像进行操作,一方面可以用来进行图像的算术运算,另一方面可以把图像看做矩阵进行矩阵的拆分与拼接等操作。

1、numpy对于矩阵的操作
矩阵加减乘除

针对以上的图像的算数操作

import numpy as np
#创建两个数组 a,b 并重置为3*3的矩阵
a = np.arange(9, dtype = np.float_).reshape(3,3)
b = np.arange(9, dtype = np.float_).reshape(3,3)
# 矩阵相加,两种方法,直接加或者使用numpy自带的方法
print(a+b)
print(np.add(a+b))
# 矩阵相减
print(a-b)
print(np.subtract(a,b))  #使用自带的方法时须注意减数和被减数的位置
# 矩阵相乘,这个方法是a,b中的元素分别每一项分别相乘,若需要求矩阵的值,numpy有点乘操作np.dot()
print(a*b)
print(np.multiply(a,b))
# 矩阵相除,使用除法时需要注意除数不能为0
print(a/b)
print(np.divide(a,b))
2、numpy在图像中的应用

在图像处理中,常用到矩阵的剪切操作,对应的是图片的剪切。可以从图像的组成来理解,图像是有三维矩阵组成的,每个维度对应的图片的宽,高,通道数,所以可以将前两维进行剪切来进行图片的裁剪。
使用opencv读取图像后可以使用 img.shape 来获取图片的高(h),宽(w),通道数(n)(注意顺序不能边),对应的矩阵中img[宽,高,通道],顺序不能搞错,否则可能报数组越界的错误。

# 假设图片为1920*1080,需要剪切左上角像素为100*150的小图
roi = img[:150,:100]
# 获取图片的某一个点的像素,此时可以获取(0,0)点的像素值,格式为[g,b,r]
p = img[0][0]

五、图片的基本操作

1.路径中不含中文
# 读取图片
img = cv2.imread(imgPath)
# 保存图片
cv2.imwrite("saveName",img)

直接使用 cv2.imread() 和cv2.imwrite() 方法即可

2.路径中含有中文

路径中含有中文时,需要编解码才能读取和保存

cv2.imdecode()函数从指定的内存缓存中读取数据,并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像。

cv2.imencode()函数是将图片格式转换(编码)成流数据,赋值到内存缓存中;主要用于图像数据格式的压缩,方便网络传输。

# 读取带有中文的图片
# 需要先进行编码,才能读取,使用numpy加载文件的格式进行加载,detype参数
# 为读取数据的类型,可以根据图片类型进行选择
img = cv2.imdecode(np.fromfile(img_Path,dtype=np.uint8),-1)
# 保存带中文的图片
cv2.imencode('.jpg', img)[1].tofile("imgName")

想到的很多,时间紧迫,先总结到这里吧,后续补充。。。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值