目录
一、图像的读入、显示和保存
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不能省略
例:
源代码

效果图

实操
01-图像融合
代码

结果
结果(1:1)

结果(0.3:0.8)

结果(0.7:0.4)

1091

被折叠的 条评论
为什么被折叠?



