【Opencv学习】PART1-图像基础处理
目录
一、图像的读入、显示和保存
1、读入图像
imread函数
范例
显示控制参数
2、显示图像
imshow函数
范例
tips
waitkey函数
含义
delay参数:
tips
destoryAllWindows函数
3、保存图像
imwrite函数
范例
实操
01-读入显示保存
代码
结果
二、图像处理入门
1、图像分类(图像构成)
二值图像
灰度图像
彩色图像
RGB三原色
三层组成
tips
2、图片转换
RGB转灰度
灰度转二值
三、像素处理
1、读取像素
例
2、修改像素值
灰度图像
BGR图像
实操
01-读取像素值
代码
结果
02-统一修改像素值
代码
结果
03-逐个修改像素值
代码
结果
04-修改指定通道值
代码1
结果1
代码2
结果2
代码3
结果3
代码4
结果4
05-修改多行像素
改窗口前代码
改窗口后代码(窗口过大,难对比)
结果对比
四、使用numpy访问像素
1、读取像素
item函数
例
灰度图像,返回灰度值
BGR图像,返回值为B、G、R的值
2、修改像素值
itemset函数
灰度图像
BGR图像(需要分别对通道进行设置)
实操
01-灰度图像
代码
结果
02-彩色图像
代码
结果
03-多通道
代码
结果
五、获取图像属性
1、shape参数
例
灰度图像
彩色图像
2、size参数
例
3、dtype参数
例
具体代码
实操
01-获取图像属性
代码
结果
六、感兴趣区域ROI
概念解析
简单解析
具体代码
实操
01-提取出感兴趣区域ROI
代码
结果
02-复制感兴趣区域至原图
代码
结果
03-复制感兴趣区域到其他图
代码
编辑结果
七、通道的拆分与合并
1、拆分通道
直接使用opencv
用split函数
具体例子
01-一次性拆分
代码
结果
02-每次只拆一个通道
代码
2、合并通道编辑
01-merge函数
代码
结果
02-B通道与其余都为0的通道合并
代码
结果
03-G通道与其余都为0的通道合并
代码
04-R通道与其余都为0的通道合并
代码
结果
具体实施
01拆分-直接opencv拆分
代码
结果
02拆分-split函数拆分-一次性拆分
代码
结果
03-拆分-split函数拆分-分通道拆分
代码
结果
04-拆分合并-拆分通道展示并合并
代码
结果
错误结果(RGB)
05-合并
代码
结果
八、加法运算
1、Numpy加法
2、Opencv加法
二者比较
比较代码
实操
01-图像加法
代码
结果
九、图像融合
概念解析
二者对比
addWeighted函数
例
实操
01-图像融合
代码
结果
结果(1:1)
结果(0.3:0.8)
结果(0.7:0.4)
一、图像的读入、显示和保存
1、读入图像
imread函数
- retval = cv2.imread(文件名[,显示控制参数])
- 文件名:完整文件名
- 参数:
- cv.IMREAD_UNCHANGED
- cv.IMREAD_GRAYSCALE
- cv.IMREAD_COLOR
- 显示控制参数:指定显示的类型(如不改变显示,以灰度形式显示,以彩色形式显示…)
用一个参数显示文件名即可
范例:
img = cv2.imread("d:\\image.jpg")
解析:
cv2:库名
第一个\:转义字符
第二个\:
显示控制参数:
第二个参数的形式多样
2、显示图像
imshow函数
- None = cv2.imshow(窗口名,图像名)
范例:
cv2.imshow(“demo”,image)
tips:
窗口名不要中文,中文可能不显示
waitkey函数
- retval = cv2.waitKey( [,delay])
-
含义:等待,靠delay来控制;什么都没有为无限等待
-
delay参数:
- delay > 0,等待delay毫秒
- delay < 0,等待键盘单击
- delay = 0,无限等待
tips:
通常设为 cv2.watKey(0)
自行手动关闭窗口
destoryAllWindows函数
- cv2.destoryAllWindows()
- 功能:删除所有窗口
3、保存图像
imwrite函数
- retval = cv2.imwrite(文件地址,文件名)
范例:
cv2.imwrite("D:\\test.jpg",img)
意为将img保存为D盘中test.jpg
实操
01-读入显示保存
代码:
import cv2:导入opencv的库
结果:
显示结果
保存结果
二、图像处理入门
- 图像是由像素构成的
1、图像分类(图像构成)
三种类别(如下图):
- 二值图像-任何一点非黑即白(只有两个值)
- 灰度图像-白黑灰三色(把灰度分成256个不同的颜色,比二值图像更细腻)
- RGB图像-一般指彩色图像
二值图像
值要么是0,要么是1,不能为别的值
灰度图像
最小值为0,最大值为255
某一像素点值为0,即纯黑色;值为255,即纯白;0~255间为灰色;所以一共分成256种颜色
彩色图像
RGB三原色
计算机中所有颜色都可以通过不同比例的RGB三种颜色混合得到
例:RGB三原色每一个值也为0~255间
三层组成(一个位置三个值,与二值图像、灰度图像都不同)
tips:
opencv里正常的通道顺序为BGR
与通常的RGB不一样,所以通常需要调整顺序
2、图片转换
RGB转灰度
通过加权的计算,不会丢失信息,确保RGB都保存在灰度图像里
灰度转二值
三、像素处理
1、读取像素
- 返回值=图像(位置参数)
例:
- 灰度图像,返回灰度值
p = img[88,142]
#访问第88行,142列的像素
print(p)
- BGR图像,返回B、G、R的值->(B,G,R)三个通道
-指定通道
blue = img[78,125,0] green = img[78,125,1] red = img[78,125,2]
print(blue) print(green) print(red)
-无指定通道
p = img[78,125]
print(p)
2、修改像素值
- 像素 = 新值
-
灰度图像
print(img[88,99])
img[88,99] = 255
print(img[88,99]) ->验证成不成功
-
BGR图像
-分通道去设置image的通道
print(img[88,99,0])
print(img[88,99,1])
print(img[88,99,2])
img([88,99,0])=255
img([88,99,1])=255
img([88,99,2])=255
print(img[88,99,0])
print(img[88,99,1])
print(img[88,99,2])
-不分通道处理
print(img[88,99])
img[88,99] = [255,255,255] ->三个通道一次性赋值
print(img[88,99])
实操
01-读取像素值
代码:
结果:
02-统一修改像素值
代码:
结果:
03-逐个修改像素值
代码:
结果:
04-修改指定通道值
代码1
结果1
代码2
结果2
代码3
结果3
代码4
无通道3,只有012
结果4
05-修改多行像素
改窗口前代码:
改窗口后代码:(窗口过大,难对比)
结果对比:
[255,255,255]
[0,0,0]
[255,0,0]
[0,255,0]
[0,0,255]
四、使用numpy访问像素
1、读取像素
item函数
- 用item函数来读取位置参数
- 返回值 = 图像.item(位置参数)
例
-
灰度图像,返回灰度值
p = img.item(88,142)
print(p)
-
BGR图像,返回值为B、G、R的值
blue = img.item(78,125,0)
green = img.item(78,125,1)
red = img.item(78,125,2)
print(blue)
pirnt(green)
print(red)
2、修改像素值
itemset函数
- 图像名.itemset(位置,新值)
-
灰度图像
print(img.item(88,99)) ->打印初始值
img.itemset((88,99),255)
print(img.item(88,99)) ->打印更改值
-
BGR图像(需要分别对通道进行设置)
print(img.item(88,99,0)) ->打印初始值
print(img.item(88,99,1))
print(img.item(88,99,2))
img.itemset((88,99,0),255)
img.itemset((88,99,1),255)
img.itemset((88,99,2),255)
print(img.item(88,99,0)) ->打印更改值
print(img.item(88,99,1))
print(img.item(88,99,2))
实操
01-灰度图像
代码
结果
02-彩色图像
代码
结果
03-多通道
代码
结果
五、获取图像属性
1、shape参数
表示形状:行、列、通道数
shape可以获得图像的形状,返回包括行数、列数、通道数的元组
灰度 返回行数,列数
彩色 返回行数,列数,通道数
例
灰度图像
import cv2
img1 = cv2.imread('灰度图像')
print(img1,shape)
##(512,512) ->(行数,列数)
彩色图像
import cv2
img2 = cv2.imread('彩色图像')
print(img2,shape)
##(5121,512,3) ->(行数,列数,通道数)
2、size参数
表示像素数目
size可以获取图像的像素目录
·灰度 返回:行数*列数
·彩色 返回:行数*列数*通道数
例
import cv2
img = cv2.imread('图像名')
print(img.size)
## 786432
3、dtype参数
表示图像的数据类型
dtype返回的是图像的数据类型
例
import cv2
img = cv2.imread('图像名称')
print(img.dtype)
## unit8
具体代码
结果
实操
01-获取图像属性
代码
结果
六、感兴趣区域ROI
概念解析
·ROI(region of internet),感兴趣区域
·从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域
·可以通过各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理
若只对脸部感兴趣,则圈画部分为感兴趣区域ROI
简单解析
通过下标的方式具体引用
复制感兴趣块
具体代码
-找感兴趣块
-复制感兴趣块
-保存感兴趣块,并存入另一图中
实操
01-提取出感兴趣区域ROI
代码
结果
02-复制感兴趣区域至原图
代码
结果
03-复制感兴趣区域到其他图
代码
结果
七、通道的拆分与合并
1、拆分通道
-
直接使用opencv
import cv2
img = cv2.imread('图像名')
b = img[ : , : , 0]
g = img[ : , : ,1]
r = img[ : , : , 2]
-
用split函数
import cv2
img = cv2.imread('图像名')
b,g,r = cv2.split(img)
具体例子
01-一次性拆分
代码
import cv2
import numpy as np
a = cv2.imread("image\\lenacolor.png")
b,g,r = cv2.split(a)
cv2.imshow("B",b)
cv2.imshow("G",g)
cv2.imshow("R",r)
cv2.waitKey()
cv2.destoryAllWindows()
结果
每个通道都是独立的,为灰度图像
02-每次只拆一个通道
代码
import cv2
import numpy as np
a = cv2.imread("image\\lenacolor.png")
b = cv2.split(a)[0]
g = cv2.split(a)[1]
r = cv2.split(a)[2]
2、合并通道
01-merge函数
(注意合并的顺序!!)(原用BGR图像分离)
代码
import cv2
import numpy as np
a = cv2.imread("image\\lenacolor.png")
b,g,r = cv2.split(a)
bgr = cv2.merge([b,g,r]) ->BGR通道
rgb = cv2.merge([r,g,b]) ->RGB通道
cv2.imshow("BGR",bgr)
cv2.imshow("RGB",rgb)
cv2.waitKey(0)
cv2.destoryAllWindows()
结果
(左BGR通道,右RGB通道)
02-B通道与其余都为0的通道合并
代码
import cv2
import numpy as np
a = cv2.imread("image\\lenacolor.png")
rows,cols,chn = a.shape
b = cv2.split(a)[0]
g = np.zeros((rows,cols),dtype = a.dtype)
r = np.zeros((rows,cols),dtype = a.dtype)
m = cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey(0)
cv2.destoryAllWindows()
结果
03-G通道与其余都为0的通道合并
代码
import cv2
import numpy as np
a = cv2.imread("image\\lenacolor.png")
rows,cols,chn = a.shape
b = np.zeros((rows,cols),dtype = a.dtype)
g = cv2.split(a)[1]
r = np.zeros((rows,cols),dtype = a.dtype)
m = cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey(0)
cv2.destoryAllWindows()
结果
04-R通道与其余都为0的通道合并
代码
import cv2
import numpy as np
a = cv2.imread("image\\lenacolor.png")
rows,cols,chn = a.shape
b = np.zeros((rows,cols),dtype = a.dtype)
g = np.zeros((rows,cols),dtype = a.dtype)
r = cv2.split(a)[2]
m = cv2.merge([b,g,r])
cv2.imshow("merge",m)
cv2.waitKey(0)
cv2.destoryAllWindows()
结果
具体实施
01拆分-直接opencv拆分
代码
结果
02拆分-split函数拆分-一次性拆分
代码
显数值
显图像
结果
结果1
结果2(B、G、R)
03-拆分-split函数拆分-分通道拆分
代码
结果
04-拆分合并-拆分通道展示并合并
代码
结果
错误结果(RGB)
05-合并
代码
结果
(分别split->B、G、R,其余为0)(同时对应通道0、1、2)
八、加法运算
1、Numpy加法
- 取模加法
运算方式:结果=图像1+图像2
最大值为255
2、Opencv加法
- 饱和运算
运算方式:结果=cv2.add(图像1,图像2)
二者比较
Numpy加法与Opencv加法比较(大于255的点,Numpy为黑,Opencv为白)
各自用的场合不同
注意点:参与运算的图像大小、类型必须一致;没法对不同大小的图像进行加法运算
比较代码
实操
01-图像加法
代码
结果
九、图像融合
概念解析
·将2张或2张以上的图像信息的融合到1张图像上
·融合的图像含有更多的信息、能够更方便人来观察或者计算机处理
例子:两模糊得清晰
不是简单相加,是需要对两个图像进行一系列的算法处理(以不同权重的方式)
二者对比
权重系数不一样,加法都为1,融合为不同
·图像加法:结果图像=图像1+图像2
img = img1 + img2
·图像融合:结果图像=图像1*系数1+图像2*系数2+亮度调节量
(亮度调节值可以为0)
img = img1*0.3 + img2*0.7 +18
addWeighted函数
主要为五个参数(第一个参数,及其系数,第二个参数,及其系数)
dst = cv.addWeighted(sc1,alpha,sc2,beta,gamma)
dst = src1*alpha + src2*beta + gamma;
·参数gamma不能省略
例:
源代码
效果图