娄底网站优化,广告设计学的是什么,公司品牌策划设计,如何自己做代理网站的想法OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并一、图像基础知识1.1 数字图像的概念1.2 数字图像的应用1.3 OpenCV介绍二、图像属性2.1 图像格式2.2 图像尺寸2.2.1 读入图像2.2.2 显示图像2.2.3 保存图像2.3 图像分辨率和通道数2.3.…
OpenCV与图像处理学习一——图像基础知识、读入、显示、保存图像、灰度转化、通道分离与合并一、图像基础知识1.1 数字图像的概念1.2 数字图像的应用1.3 OpenCV介绍二、图像属性2.1 图像格式2.2 图像尺寸2.2.1 读入图像2.2.2 显示图像2.2.3 保存图像2.3 图像分辨率和通道数2.3.1 灰度转化2.3.2 RGB与BGR转化2.3.3 通道分离2.3.4 通道合并图像处理与OpenCV作为CV方向的基础在正式系统地学习论文之前有必要对其进行系统的学习。而OpenCV作为使用最为广泛的图像处理工具包这里将其作为学习的工具因为较为熟悉python所以使用OpenCV的python接口来完成代码。
图像处理与OpenCV的学习主要包括五个部分
图像基础知识图像处理图像分割图像特征与目标检测运动目标识别视频
psOpenCV-python版的官方文档https://docs.opencv.org/4.1.2/d6/d00/tutorial_py_root.html
一、图像基础知识
1.1 数字图像的概念
数字图像又称为数码图像或数位图像是二维图像用有限数字数值像素的表示由数组成矩阵来表示。下图是一个例子 我们看见的图像在计算机中其实是由一个个像素组成的每个像素有其具体数值。
也可以理解为一个二维函数 f(x,y)其中x和y是空间平面坐标而在任意坐标处幅值 f 称为图像在该点处的强度或灰度。
1.2 数字图像的应用
图像处理、机器视觉与人工智能的关系
图像处理主要研究二维检测处理一个图像或一组图像之间的相互转换的过程包括图像滤波、图像识别、图像分割等问题。机器视觉主要研究映射到单幅或多幅图像上的三维场景从图像中提取抽象的语义信息实现图像理解是CV的终极目标。人工智能在计算机视觉上的目标就是解决像素值和语义之间的关系主要的问题有图片检测、图片识别、图片分割和检索等。
1.3 OpenCV介绍
OpenCV于1999年由Intel建立是一个开源发行的跨平台计算机视觉库支持的操作系统有Linux、Windows、Android、macOS。
由C函数与少量C类构成支持Python、Java、MATLAB等接口是数字图像处理和CV领域最常见的工具包是学习、科研、企业项目的好帮手。 OpenCV的安装默认python已经安装
打开命令行输入以下命令即可自动下载安装
pip install opencv-contrib-python二、图像属性
2.1 图像格式
常见的图像格式如下所示
BMP格式这是Windows系统下的标准位图格式未经过压缩一般图像文件会比较大后缀为.bmp。JPEG格式应用最广泛的图片格式之一它采用一种特殊的有损压缩算法达到比较大的压缩比可达到2:1甚至40:1后缀名为.jpg或.jpeg。GIF格式不仅可以是一张静图也可以是动图并且支持透明背景图像适用于多种操作系统“体型”很小网上很多小动画都是GIF格式。但是其色域不太广只支持256色。PNG格式与JPG格式类似压缩比高于GIF支持图像透明支持Alpha通道调节图像的透明度。TIFF格式图像格式复杂存贮信息多在Mac中广泛使用非常有利于原稿的复制很多地方将TIFF格式用于印刷。
2.2 图像尺寸
图像尺寸的长度和宽度是以像素为单位的比如下面图片的尺寸是240×150这个数字的单位就是像素。那么像素具体是什么含义
像素pixel
像素是数码影像最基本的单位。1.1那张图中数字化后图片变成了一个个小格子组成的大矩阵每个小格子就是一个像素它里面会有一个值灰度像素点的值的范围在0~255之间0表示黑色255表示白色其他值是介于黑白之间的不同灰
如果是彩色图会需要用到红、绿、蓝三个通道的二维矩阵来表示在每个通道中每个值也介于0~255之间0表示相应的基色而255表示相应基色在该像素中取得的最大值。
2.2.1 读入图像
cv2.imread( filename[, flags] )参数第一个参数为读入图像的路径第二个则是读取的方式常见方式有
cv2.IMREAD_COLOR默认方式读取彩色图像也可以用 1 来表示。cv2.IMREAD_GRAYSCALE读取图像为灰度图也可以用 0 来表示。cv2.IMREAD_UNCHANGED读取彩色图并且包括透明度通道也可以用 -1 来表示。
举例
# 导入opencv的python版本依赖库cv2
import cv2
# 使用opencv中imread函数读取图片
# 0代表灰度图形式打开1代表彩色形式打开
img cv2.imread(split.jpg, 1)
print(img.shape)输出为这张图片的尺寸shape
(459, 571, 3)2.2.2 显示图像
cv2.imshow( winname, mat )参数第一个参数为窗口的名字显示图片必须先有一个窗口第二个参数为图像变量名。
举例
# 导入opencv的python版本依赖库cv2
import cv2
# 使用opencv中imread函数读取图片
# 0代表灰度图形式打开1代表彩色形式打开
img cv2.imread(split.jpg, 1)
print(img.shape)
# print(img)cv2.imshow(photo, img)
k cv2.waitKey(0)
if k 27: # 输入ESC键退出cv2.destroyAllWindows()
elif k ord(s): # 输入S键保存图片并退出cv2.imwrite(split_.jpg, img)
cv2.destroyAllWindows()其中cv2.waitKey()函数是一个键盘绑定函数单位为毫秒即程序等待键盘输入多少毫秒在这等待的时间内从键盘输入的键值会赋给k然后k去进行下一步程序如cv2.waitKey(1000)就是等待1s如果参数值为0则表示一直等待直到键盘有输入。
另外cv2.destroyAllWindows()函数表示删除窗口默认删除所有窗口参数为待删窗口名。
2.2.3 保存图像
cv2.imwrite( filename, img[, params] )参数第一个参数为希望保存成的图像名包括格式后缀第二个参数为待写入的图像变量名。
2.2.2的代码已经给出了举例。
2.3 图像分辨率和通道数
分辨率是指单位长度中所表达或截取的像素数目。每英寸图像内的像素点数单位是像素每英寸ppi。图像的分辨率越高像素点密度越高图像越清晰。
通道数是指图像的位深度描述图像中每个pixel数值所占的二进制位数。位深度越大则图像能表示的颜色数越多色彩就越丰富。有以下几种位深度
8位单通道图像也就是灰度图灰度值取值种类为2 ^ 8 256种即0~255。24位三通道彩色图像每个通道都有8位。32位三通道彩色图像加上透明度Alpha通道。
2.3.1 灰度转化
目的将彩色图转化为灰度图。 公式
3通道彩图-1通道灰图GRAY B * 0.114 G * 0.587 R * 0.2991通道灰图-3通道灰图R G B GRAYA 0
函数为
cv2.cvtColor( src, code[, dst[, dstCn]] )参数第一个参数就是待转化的图像变量第二个参数是转换模式OpenCV有二百多种模式转换具体可以通过以下代码查看 import cv2 as cvflags [i for i in dir(cv) if i.startswith(COLOR_)]print( flags )输出如下
[COLOR_BAYER_BG2BGR, COLOR_BAYER_BG2BGRA, COLOR_BAYER_BG2BGR_EA, COLOR_BAYER_BG2BGR_VNG, COLOR_BAYER_BG2GRAY, COLOR_BAYER_BG2RGB, COLOR_BAYER_BG2RGBA, COLOR_BAYER_BG2RGB_EA, COLOR_BAYER_BG2RGB_VNG, COLOR_BAYER_GB2BGR, COLOR_BAYER_GB2BGRA, COLOR_BAYER_GB2BGR_EA, COLOR_BAYER_GB2BGR_VNG, COLOR_BAYER_GB2GRAY, COLOR_BAYER_GB2RGB, COLOR_BAYER_GB2RGBA, COLOR_BAYER_GB2RGB_EA, COLOR_BAYER_GB2RGB_VNG, COLOR_BAYER_GR2BGR, COLOR_BAYER_GR2BGRA, COLOR_BAYER_GR2BGR_EA, COLOR_BAYER_GR2BGR_VNG, COLOR_BAYER_GR2GRAY, COLOR_BAYER_GR2RGB, COLOR_BAYER_GR2RGBA, COLOR_BAYER_GR2RGB_EA, COLOR_BAYER_GR2RGB_VNG, COLOR_BAYER_RG2BGR, COLOR_BAYER_RG2BGRA, COLOR_BAYER_RG2BGR_EA, COLOR_BAYER_RG2BGR_VNG, COLOR_BAYER_RG2GRAY, COLOR_BAYER_RG2RGB, COLOR_BAYER_RG2RGBA, COLOR_BAYER_RG2RGB_EA, COLOR_BAYER_RG2RGB_VNG, COLOR_BGR2BGR555, COLOR_BGR2BGR565, COLOR_BGR2BGRA, COLOR_BGR2GRAY, COLOR_BGR2HLS, COLOR_BGR2HLS_FULL, COLOR_BGR2HSV, COLOR_BGR2HSV_FULL, COLOR_BGR2LAB, COLOR_BGR2LUV, COLOR_BGR2Lab, COLOR_BGR2Luv, COLOR_BGR2RGB, COLOR_BGR2RGBA, COLOR_BGR2XYZ, COLOR_BGR2YCR_CB, COLOR_BGR2YCrCb, COLOR_BGR2YUV, COLOR_BGR2YUV_I420, COLOR_BGR2YUV_IYUV, COLOR_BGR2YUV_YV12, COLOR_BGR5552BGR, COLOR_BGR5552BGRA, COLOR_BGR5552GRAY, COLOR_BGR5552RGB, COLOR_BGR5552RGBA, COLOR_BGR5652BGR, COLOR_BGR5652BGRA, COLOR_BGR5652GRAY, COLOR_BGR5652RGB, COLOR_BGR5652RGBA, COLOR_BGRA2BGR, COLOR_BGRA2BGR555, COLOR_BGRA2BGR565, COLOR_BGRA2GRAY, COLOR_BGRA2RGB, COLOR_BGRA2RGBA, COLOR_BGRA2YUV_I420, COLOR_BGRA2YUV_IYUV, COLOR_BGRA2YUV_YV12, COLOR_BayerBG2BGR, COLOR_BayerBG2BGRA, COLOR_BayerBG2BGR_EA, COLOR_BayerBG2BGR_VNG, COLOR_BayerBG2GRAY, COLOR_BayerBG2RGB, COLOR_BayerBG2RGBA, COLOR_BayerBG2RGB_EA, COLOR_BayerBG2RGB_VNG, COLOR_BayerGB2BGR, COLOR_BayerGB2BGRA, COLOR_BayerGB2BGR_EA, COLOR_BayerGB2BGR_VNG, COLOR_BayerGB2GRAY, COLOR_BayerGB2RGB, COLOR_BayerGB2RGBA, COLOR_BayerGB2RGB_EA, COLOR_BayerGB2RGB_VNG, COLOR_BayerGR2BGR, COLOR_BayerGR2BGRA, COLOR_BayerGR2BGR_EA, COLOR_BayerGR2BGR_VNG, COLOR_BayerGR2GRAY, COLOR_BayerGR2RGB, COLOR_BayerGR2RGBA, COLOR_BayerGR2RGB_EA, COLOR_BayerGR2RGB_VNG, COLOR_BayerRG2BGR, COLOR_BayerRG2BGRA, COLOR_BayerRG2BGR_EA, COLOR_BayerRG2BGR_VNG, COLOR_BayerRG2GRAY, COLOR_BayerRG2RGB, COLOR_BayerRG2RGBA, COLOR_BayerRG2RGB_EA, COLOR_BayerRG2RGB_VNG, COLOR_COLORCVT_MAX, COLOR_GRAY2BGR, COLOR_GRAY2BGR555, COLOR_GRAY2BGR565, COLOR_GRAY2BGRA, COLOR_GRAY2RGB, COLOR_GRAY2RGBA, COLOR_HLS2BGR, COLOR_HLS2BGR_FULL, COLOR_HLS2RGB, COLOR_HLS2RGB_FULL, COLOR_HSV2BGR, COLOR_HSV2BGR_FULL, COLOR_HSV2RGB, COLOR_HSV2RGB_FULL, COLOR_LAB2BGR, COLOR_LAB2LBGR, COLOR_LAB2LRGB, COLOR_LAB2RGB, COLOR_LBGR2LAB, COLOR_LBGR2LUV, COLOR_LBGR2Lab, COLOR_LBGR2Luv, COLOR_LRGB2LAB, COLOR_LRGB2LUV, COLOR_LRGB2Lab, COLOR_LRGB2Luv, COLOR_LUV2BGR, COLOR_LUV2LBGR, COLOR_LUV2LRGB, COLOR_LUV2RGB, COLOR_Lab2BGR, COLOR_Lab2LBGR, COLOR_Lab2LRGB, COLOR_Lab2RGB, COLOR_Luv2BGR, COLOR_Luv2LBGR, COLOR_Luv2LRGB, COLOR_Luv2RGB, COLOR_M_RGBA2RGBA, COLOR_RGB2BGR, COLOR_RGB2BGR555, COLOR_RGB2BGR565, COLOR_RGB2BGRA, COLOR_RGB2GRAY, COLOR_RGB2HLS, COLOR_RGB2HLS_FULL, COLOR_RGB2HSV, COLOR_RGB2HSV_FULL, COLOR_RGB2LAB, COLOR_RGB2LUV, COLOR_RGB2Lab, COLOR_RGB2Luv, COLOR_RGB2RGBA, COLOR_RGB2XYZ, COLOR_RGB2YCR_CB, COLOR_RGB2YCrCb, COLOR_RGB2YUV, COLOR_RGB2YUV_I420, COLOR_RGB2YUV_IYUV, COLOR_RGB2YUV_YV12, COLOR_RGBA2BGR, COLOR_RGBA2BGR555, COLOR_RGBA2BGR565, COLOR_RGBA2BGRA, COLOR_RGBA2GRAY, COLOR_RGBA2M_RGBA, COLOR_RGBA2RGB, COLOR_RGBA2YUV_I420, COLOR_RGBA2YUV_IYUV, COLOR_RGBA2YUV_YV12, COLOR_RGBA2mRGBA, COLOR_XYZ2BGR, COLOR_XYZ2RGB, COLOR_YCR_CB2BGR, COLOR_YCR_CB2RGB, COLOR_YCrCb2BGR, COLOR_YCrCb2RGB, COLOR_YUV2BGR, COLOR_YUV2BGRA_I420, COLOR_YUV2BGRA_IYUV, COLOR_YUV2BGRA_NV12, COLOR_YUV2BGRA_NV21, COLOR_YUV2BGRA_UYNV, COLOR_YUV2BGRA_UYVY, COLOR_YUV2BGRA_Y422, COLOR_YUV2BGRA_YUNV, COLOR_YUV2BGRA_YUY2, COLOR_YUV2BGRA_YUYV, COLOR_YUV2BGRA_YV12, COLOR_YUV2BGRA_YVYU, COLOR_YUV2BGR_I420, COLOR_YUV2BGR_IYUV, COLOR_YUV2BGR_NV12, COLOR_YUV2BGR_NV21, COLOR_YUV2BGR_UYNV, COLOR_YUV2BGR_UYVY, COLOR_YUV2BGR_Y422, COLOR_YUV2BGR_YUNV, COLOR_YUV2BGR_YUY2, COLOR_YUV2BGR_YUYV, COLOR_YUV2BGR_YV12, COLOR_YUV2BGR_YVYU, COLOR_YUV2GRAY_420, COLOR_YUV2GRAY_I420, COLOR_YUV2GRAY_IYUV, COLOR_YUV2GRAY_NV12, COLOR_YUV2GRAY_NV21, COLOR_YUV2GRAY_UYNV, COLOR_YUV2GRAY_UYVY, COLOR_YUV2GRAY_Y422, COLOR_YUV2GRAY_YUNV, COLOR_YUV2GRAY_YUY2, COLOR_YUV2GRAY_YUYV, COLOR_YUV2GRAY_YV12, COLOR_YUV2GRAY_YVYU, COLOR_YUV2RGB, COLOR_YUV2RGBA_I420, COLOR_YUV2RGBA_IYUV, COLOR_YUV2RGBA_NV12, COLOR_YUV2RGBA_NV21, COLOR_YUV2RGBA_UYNV, COLOR_YUV2RGBA_UYVY, COLOR_YUV2RGBA_Y422, COLOR_YUV2RGBA_YUNV, COLOR_YUV2RGBA_YUY2, COLOR_YUV2RGBA_YUYV, COLOR_YUV2RGBA_YV12, COLOR_YUV2RGBA_YVYU, COLOR_YUV2RGB_I420, COLOR_YUV2RGB_IYUV, COLOR_YUV2RGB_NV12, COLOR_YUV2RGB_NV21, COLOR_YUV2RGB_UYNV, COLOR_YUV2RGB_UYVY, COLOR_YUV2RGB_Y422, COLOR_YUV2RGB_YUNV, COLOR_YUV2RGB_YUY2, COLOR_YUV2RGB_YUYV, COLOR_YUV2RGB_YV12, COLOR_YUV2RGB_YVYU, COLOR_YUV420P2BGR, COLOR_YUV420P2BGRA, COLOR_YUV420P2GRAY, COLOR_YUV420P2RGB, COLOR_YUV420P2RGBA, COLOR_YUV420SP2BGR, COLOR_YUV420SP2BGRA, COLOR_YUV420SP2GRAY, COLOR_YUV420SP2RGB, COLOR_YUV420SP2RGBA, COLOR_YUV420p2BGR, COLOR_YUV420p2BGRA, COLOR_YUV420p2GRAY, COLOR_YUV420p2RGB, COLOR_YUV420p2RGBA, COLOR_YUV420sp2BGR, COLOR_YUV420sp2BGRA, COLOR_YUV420sp2GRAY, COLOR_YUV420sp2RGB, COLOR_YUV420sp2RGBA, COLOR_mRGBA2RGBA]那么这里的灰度转化需要用到的是cv2.COLOR_BGR2GRAY和cv2.COLOR_GRAY2BGR。
举例如下
# 导入opencv
import cv2
# 读入原始图像使用cv2.IMREAD_UNCHANGED
img cv2.imread(girl.jpg, cv2.IMREAD_UNCHANGED)
# 查看打印图像的shape
shape img.shape
print(shape)
# 判断通道数是否为3通道或4通道
if shape[2] 3 or shape[2] 4 :# 将彩色图转化为单通道图img_gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)cv2.imshow(gray_image, img_gray)
cv2.imshow(image, img)
cv2.waitKey(0)
cv2.destroyAllWindows()显示出来的原图与灰度化之后的图为 这里的灰度图是单通道的若将此时的img_gray 再通过cv2.COLOR_GRAY2BGR转为三通道的图它将还是灰度图只是通道数变成了三个三通道每个像素上的B、G、R值都相等且等于img_gray 的那个像素代码如下所示
# 导入opencv
import cv2
# 读入灰度图
img cv2.imread(girl_gray.jpg, cv2.IMREAD_UNCHANGED)
# 查看打印图像的shape
shape img.shape
print(shape)
img_color cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
print(img_color.shape)
cv2.imshow(color_image, img_color)
cv2.imshow(image, img)
cv2.waitKey(0)
cv2.destroyAllWindows()效果如图所示 视觉上细看还是有些许不同我们搞清楚它们在计算机内的区别就行再看下原图、单通道灰度图、三通道灰度图的尺寸区别
原图: (500, 500, 3)
单通道灰度图 (500, 500)
三通道灰度图 (500, 500, 3)2.3.2 RGB与BGR转化
方法一用OpenCV自带的方法
# 导入opencv
import cv2
# 读入图
img cv2.imread(dark2.jpg, cv2.IMREAD_COLOR)
cv2.imshow(Origin, img)
img_cv_method cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
cv2.imshow(After transform, img_cv_method)cv2.waitKey(0)
cv2.destroyAllWindows()方法二用numpy转换本质就是互换B和R通道所以将方法一的代码中的cvtColor函数的那一行替换为
img_cv_method img[:, :, ::-1]效果是一样的得到的原图和转换之后的图的显示如下所示
2.3.3 通道分离
目的将彩色图像分成B、G、R三个单通道图像方便我们对BGR三个通道分别操作。
函数
cv.split( m[, mv] )参数待分离通道的图像。
举例
# 加载opencv
import cv2
src cv2.imread(split.jpg)
cv2.imshow(before, src)
# 调用通道分离
b, g, r cv2.split(src)
# 三通道分别显示
cv2.imshow(blue, b)
cv2.imshow(green, g)
cv2.imshow(red, r)
cv2.waitKey(0)
cv2.destroyAllWindows()结果如下所示 分离出来的每个通道都是一个灰度图。如果我们想看它们是对应通道的颜色可以用下面的代码
# 导入opencv模块
import numpy as np
import cv2image cv2.imread(split.jpg) # 读取要处理的图片
cv2.imshow(src, image)
cv2.waitKey(0)
B, G, R cv2.split(image) # 分离出图片的BRG颜色通道zeros np.zeros(image.shape[:2], dtypeuint8) # 创建与image相同大小的零矩阵
cv2.imshow(BLUE, cv2.merge([B, zeros, zeros])) # 显示 B00图像
cv2.imshow(GREEN, cv2.merge([zeros, G, zeros])) # 显示0G0图像
cv2.imshow(RED, cv2.merge([zeros, zeros, R])) # 显示00R图像
cv2.waitKey(0)
cv2.destroyAllWindows()效果如下所示 这里我们可以看出单通道是没有颜色的只有数值R、G、B颜色要放在三通道中才能显示出来。
2.3.4 通道合并
目的三个单独的通道合并为一个彩图。
函数
cv.merge( mv[, dst] )参数待合并的通道数以list形式输入。
举例
#加载opencv
import cv2
srccv2.imread(split.jpg)
cv2.imshow(before,src)
#调用通道分离
b,g,rcv2.split(src)
#将Blue通道数值修改为0
b[:] 0
#合并修改后的通道
img_mergecv2.merge([b,g,r])
cv2.imshow(merge,img_merge)
cv2.waitKey(0)
cv2.destroyAllWindows()结果如下所示