该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各类算法,包括图像锐化算子、图像加强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。但愿文章对您有所帮助,若是有不足之处,还请海涵~python
该系列在github全部源代码:https://github.com/eastmountyxz/ImageProcessing-Python
PS:请求帮忙点个Star,哈哈,第一次使用Github,之后会分享更多代码,一块儿加油。git
同时推荐做者的C++图像系列知识:
[数字图像处理] 一.MFC详解显示BMP格式图片
[数字图像处理] 二.MFC单文档分割窗口显示图片
[数字图像处理] 三.MFC实现图像灰度、采样和量化功能详解
[数字图像处理] 四.MFC对话框绘制灰度直方图
[数字图像处理] 五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解
[数字图像处理] 六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
[数字图像处理] 七.MFC图像加强之图像普通平滑、高斯平滑、Laplacian、Sobel、Prewitt锐化详解github
前文参考:
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
[Python图像处理] 二.OpenCV+Numpy库读取与修改像素web
本篇文章主要讲解Python调用OpenCV获取图像属性,截取感兴趣ROI区域,处理图像通道。全文均是基础知识,但愿对您有所帮助。知识点以下:
1.获取图像属性
2.获取感兴趣ROI区域
3.图像通道处理算法
PSS:2019年1~2月做者参加了CSDN2018年博客评选,但愿您能投出宝贵的一票。我是59号,Eastmount,杨秀璋。投票地址:https://bss.csdn.net/m/topic/blog_star2018/index网络
1.形状-shape
经过shape关键字获取图像的形状,返回包含行数、列数、通道数的元祖。其中灰度图像返回行数和列数,彩色图像返回行数、列数和通道数。以下图所示:svg
# -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #显示图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下图所示:(445L, 670L, 3L),该图共445行、670列像素,3个通道。函数
2.像素数目-size
经过size关键字获取图像的像素数目,其中灰度图像返回行数 * 列数,彩色图像返回行数 * 列数 * 通道数。代码以下:学习
# -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #获取像素数目 print(img.size)
输出结果:
(445L, 670L, 3L)
894450ui
3.图像类型-dtype
经过dtype关键字获取图像的数据类型,一般返回uint8。代码以下:
# -*- coding:utf-8 -*- import cv2 import numpy #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #获取图像形状 print(img.shape) #获取像素数目 print(img.size) #获取图像类型 print(img.dtype)
输出结果:
(445L, 670L, 3L)
894450
uint8
ROI(Region of Interest)表示感兴趣区域。它是指从被处理图像以方框、圆形、椭圆、不规则多边形等方式勾勒出须要处理的区域。能够经过各类算子(Operator)和函数求得感兴趣ROI区域,并进行图像的下一步处理,被普遍应用于热点地图、人脸识别、图像分割等领域。
经过像素矩阵能够直接获取ROI区域,如img[200:400, 200:400]。
代码以下:
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #定义200*100矩阵 3对应BGR face = np.ones((200, 100, 3)) #显示原始图像 cv2.imshow("Demo", img) #显示ROI区域 face = img[200:400, 200:300] cv2.imshow("face", face) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下图所示:
下面将提取的ROI图像进行融合实验,代码以下:
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #定义300*100矩阵 3对应BGR face = np.ones((200, 200, 3)) #显示原始图像 cv2.imshow("Demo", img) #显示ROI区域 face = img[100:300, 150:350] img[0:200,0:200] = face cv2.imshow("face", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
将提取的头部融合至图像左上角部分,以下图所示:
若是想将两张图像进行融合,只需再读取一张图像便可,方法原理相似。 实现代码以下:
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) test = cv2.imread("test3.jpg", cv2.IMREAD_UNCHANGED) #定义300*100矩阵 3对应BGR face = np.ones((200, 200, 3)) #显示原始图像 cv2.imshow("Demo", img) #显示ROI区域 face = img[100:300, 150:350] test[400:600,400:600] = face cv2.imshow("Pic", test) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下图所示:
1.通道拆分
OpenCV读取的彩色图像由B、G、R三原色组成,能够经过下面代码获取不一样的通道。
b = img[:, :, 0]
g = img[:, :, 1]
r = img[:, :, 2]
也可使用split()函数拆分通道,下面是拆分不一样通道再显示的代码。
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #拆分通道 b, g, r = cv2.split(img) #显示原始图像 cv2.imshow("B", b) cv2.imshow("G", g) cv2.imshow("R", r) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下图所示:
2.通道合并
图像通道合并主要调用merge()函数实现,核心代码以下:
m = cv2.merge([b, g, r])
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #拆分通道 b, g, r = cv2.split(img) #合并通道 m = cv2.merge([b, g, r]) cv2.imshow("Merge", m) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
输出结果以下:
注意,若是是合并[r,g,b]三通道,则显示以下所示,因OpenCV是按照BGR进行读取的。
b, g, r = cv2.split(img)
m = cv2.merge([r, g, b])
cv2.imshow(“Merge”, m)
同时,能够提取图像的不一样颜色,提取B颜色通道,G、B通道设置为0,则显示蓝色。代码以下所示:
# -*- coding:utf-8 -*- import cv2 import numpy as np #读取图片 img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) rows, cols, chn = img.shape #拆分通道 b = cv2.split(img)[0] g = np.zeros((rows,cols),dtype=img.dtype) r = np.zeros((rows,cols),dtype=img.dtype) #合并通道 m = cv2.merge([b, g, r]) cv2.imshow("Merge", m) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows()
蓝色通道输出结果以下所示:
绿色通道核心代码及输出结果以下所示:
rows, cols, chn = img.shape
b = np.zeros((rows,cols),dtype=img.dtype)
g = cv2.split(img)[1]
r = np.zeros((rows,cols),dtype=img.dtype)
m = cv2.merge([b, g, r])
红色通道修改方法与上面相似。 但愿文章对你们有所帮助,若是有错误或不足之处,还请海涵。 (By:Eastmount 2018-08-29 早10点 https://blog.csdn.net/Eastmount/)