目录

  • 1 OpenCV入门
    • 1.1 如何使用
    • 1.2 图像读入、显示与保存
  • 2 图像处理基础
    • 2.1 图像处理入门基础
    • 2.2 像素处理
    • 2.3 numpy访问像素
    • 2.4 获取图像属性
    • 2.5 感兴趣区域ROI
    • 2.6 通道操作
  • 3 图像运算
    • 3.1 图像加法
    • 3.2 图像融合
    • 3.3 位平面分解
    • 3.4 图像加密和解密
    • 3.5 数字水印
  • 4 色彩空间类型转换
    • 4.1 色彩类型转换
  • 5 几何变换
    • 5.1 图像缩放
    • 5.2 图像翻转
  • 6 阈值处理
    • 6.1 阈值理论知识
    • 6.2 阈值处理实践
  • 7 图像平滑处理
    • 7.1 均值滤波
    • 7.2 方框滤波
    • 7.3 高斯滤波
    • 7.4 中值滤波
  • 8 形态学操作
    • 8.1 图像腐蚀
    • 8.2 图像膨胀
    • 8.3 开运算
    • 8.4 闭运算
    • 8.5 梯度运算
    • 8.6 礼帽操作
    • 8.7 黑帽图像处理
  • 9 图像梯度
    • 9.1 Sobel理论基础
    • 9.2 Sobel算子及函数使用
    • 9.3 Scharr算子及函数使用
    • 9.4 Sobel算子和Scharr算子的比较
    • 9.5 Laplacian算子及函数使用
  • 10 canny边缘检测
    • 10.1 Canny边缘检测原理
    • 10.2 Canny函数及使用
  • 11 图像金字塔
    • 11.1 理论基础
    • 11.2 pyrDown函数及使用
    • 11.3 pyrUp函数及使用
    • 11.4 采样可逆性的研究
    • 11.5 拉普拉斯金字塔
  • 12 图像轮廓
    • 12.1 图像轮廓操作
  • 13 直方图
    • 13.1 直方图的概念
    • 13.2 绘制直方图
    • 13.3 使用OpenCV统计直方图
    • 13.4 绘制OpenCV统计直方图
    • 13.5 使用掩膜的直方图
    • 13.6 掩膜原理及演示
    • 13.7 直方图均衡化原理
    • 13.8 直方图均衡化函数equalizeHist
    • 13.9 subplot函数的使用
    • 13.10 matplotlib.pyplot.imshow函数的使用
    • 13.11 直方图均衡化对比
  • 14 傅里叶变换
    • 14.1 傅里叶变换的理论基础
    • 14.2 numpy实现傅里叶变换
    • 14.3 numpy实现逆傅里叶变换
    • 14.4 高通滤波演示
    • 14.5 OpenCV实现傅里叶变换
    • 14.6 OpenCV实现逆傅里叶变换
    • 14.7 低通滤波示例
图像融合



二:图像融合

2张或2张以上的图像信息的融合到1张图像上

融合的图像含有更多的信息、能够更方便人来观察或者计算机处理

图像加法: 结果图像=图像1+图像2

img=img1+img2

图像融合: 结果图像=图像1*系数1+图像2*系数2+亮度调节量

img=img1*0.3+img2*0.7+18

函数addWeighted

dst=cv.addWeighted(src1, alpha, src2, beta,gamma)

dst = src1*alpha + src2*beta + gamma;

参数gamma不能省略

图像加权和:

就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可利用函数

Dst=cv2.addWeighted(src1,alpha,src2,beta,gamma)

可理解为:

结果图像=图像1*系数1+图像2*系数2+亮度调节量

3.3按位逻辑运算

常见的位运算函数

                       

 

函数名

 
 

基本含义

 
 

Cv2.bitwise_and()

 
 

按位与

 
 

Cv2.bitwise_or()

 
 

按位或

 
 

Cv2.bitwise_xor()

 
 

按位异或

 
 

Cv2.bitwise_not()

 
 

按位取反

 


 

函数:

Dst=Cv2.bitwise_and(src1,src2[,mask]])

Dst=Cv2.bitwise_or(src1,src2[,mask]])

Dst=Cv2.bitwise_not(src[,mask]])

Dst=Cv2.bitwise_xor(src1,src2[,mask]])

源代码

import cv2

a=cv2.imread("image\add\boat.bmp")

b=cv2.imread("image\add\lena.bmp")

result=cv2.addWeighted(a,1,b,1,0)

cv2.imshow("boat",a)

cv2.imshow("lena",b)

cv2.imshow("result",result)

cv2.waitKey()

cv2.destroyAllWindows()

视频代码:

#视频:图像加法
import cv2
a=cv2.imread("lena256.bmp")
b=a
result1=a+b
result2=cv2.add(a,b)
cv2.imshow("yuanshi",a)
cv2.imshow("result1",result1)
cv2.imshow("result2",result2)
cv2.waitKey()
cv2.destroyAllWindows()

#3.1使用随机数数组模拟灰度图像,观察使用“+”对像素值求和的结果
import numpy as np
img1=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
img2=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print("img1=\n",img1)
print("img2=\n",img2)
print("img1+img2=\n",img1+img2)
运行结果:
img1=
 [[ 12  42  65]
 [ 87  58 177]
 [124  87 122]]
img2=
 [[174 235 192]
 [230 181 225]
 [212 205 129]]
img1+img2=
 [[186  21   1]
 [ 61 239 146]
 [ 80  36 251]]
 
#3.2使用随机数组模拟灰度图像,观察函数cv2.add()对像素值求和的结果。
import numpy as np
import cv2
img1=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
img2=np.random.randint(0,256,size=[3,3],dtype=np.uint8)
print("img1=\n",img1)
print("img2=\n",img2)
img3=cv2.add(img1,img2)
print("cv2.add(img1,img2)=\n",img3)
运行结果:
img1=
 [[108 204 155]
 [ 25  47 235]
 [140 135 195]]
img2=
 [[249 144  83]
 [249  80 193]
 [227  47 131]]
cv2.add(img1,img2)=
 [[255 255 238]
 [255 127 255]
 [255 182 255]]
 

 

#3.3分别使用加号运算符和函数cv2.add()计算两幅灰度图像的像素值之和,观察处理结果
import cv2

a=cv2.imread("lena.bmp",0)
b=a
result1=a+b
result2=cv2.add(a,b)
cv2.imshow("original",a)
cv2.imshow("result1",result1)
cv2.imshow("result2",result2)
cv2.waitKey()
cv2.destroyAllWindows()

视频:图像融合讲解

#视频:图像融合图像加权运算
import cv2
a=cv2.imread("boat.bmp",-1)
b=cv2.imread("lena.bmp",-1)
# result=cv2.addWeighted(a,1,b,1,0)
# result=cv2.addWeighted(a,0.3,b,0.6,0)

result=cv2.addWeighted(a,0.6,b,0.3,0)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("result",result)
cv2.waitKey(0)
cv2.destroyAllWindows()
 
#3.4使用数组演示函数cv2.addWeighted()的使用
import cv2
import numpy as np
img1=np.ones((3,4),dtype=np.uint8)*100#
生产3*4100数组;生产3*410数组
img2=np.ones((3,4),dtype=np.uint8)*10
gamma=3

img3=cv2.addWeighted(img1,0.6,img2,5,gamma)#img1*0.6+img2*5+gamma
print(img1)
print(img2)
print(img3)
 
运行结果:
[[100 100 100 100]
 [100 100 100 100]
 [100 100 100 100]]
[[10 10 10 10]
 [10 10 10 10]
 [10 10 10 10]]
[[113 113 113 113]
 [113 113 113 113]
 [113 113 113 113]]

 

#3.5使用函数cv2.Weighted()对两幅图像进行加权混合,观察处理结果。
import cv2
a=cv2.imread("boat.bmp")
b=cv2.imread("lena.bmp")
result=cv2.addWeighted(a,0.6,b,0.4,0)
cv2.imshow("boat",a)
cv2.imshow("lena",b)
cv2.imshow("result",result)
cv2.waitKey()
cv2.destroyAllWindows()

#3.6使用函数cv2.addWeighted()将一副图像的ROI混合在另外一副图像内
import cv2

lena=cv2.imread("lena512.bmp",cv2.IMREAD_UNCHANGED)
dollar=cv2.imread("dollar.bmp",cv2.IMREAD_UNCHANGED)
cv2.imshow("lena",lena)
cv2.imshow("dollar",dollar)
face1=lena[220:400,250:350]
face2=dollar[160:340,200:300]
add=cv2.addWeighted(face1,0.6,face2,0.4,0)
dollar[160:340,200:300]=add
cv2.imshow("result",dollar)
cv2.waitKey()
cv2.destroyAllWindows()

 
表-常见的位运算函数

                   

函数名
基本含义
Cv2.bitwise_and()
按位与
Cv2.bitwise_or()
按位或
Cv2.bitwise_xor()
按位异或
Cv2.bitwise_not()
按位取反
 
OpenCV中运算函数格式如下:
Dst=Cv2.bitwise_and(src1,src2[,mask]])#按位与
Dst=Cv2.bitwise_or(src1,src2[,mask]])#按位或
Dst=Cv2.bitwise_xor(src1,src2[,mask]])#按位异或
Dst=Cv2.bitwise_not(src[,mask])#按位非
 
#3.7使用数组演示与掩模图像的按位与运算。
import cv2
import numpy  as np
a=np.random.randint(0,255,(5,5),dtype=np.uint8)
b=np.zeros((5,5),dtype=np.uint8)
b[0:3,0:3]=255
b[4,4]=255
c=cv2.bitwise_and(a,b)
print("a=\n",a)
print("b=\n",b)
print("c=\n",c)
运行结果:
a=
 [[ 13  13 125  16 146]
 [210   2 132 185 144]
 [ 35  75 170  85  93]
 [  7  20  44  77 174]
 [115  42   2 138  10]]
b=
 [[255 255 255   0   0]
 [255 255 255   0   0]
 [255 255 255   0   0]
 [  0   0   0   0   0]
 [  0   0   0   0 255]]
c=
 [[ 13  13 125   0   0]
 [210   2 132   0   0]
 [ 35  75 170   0   0]
 [  0   0   0   0   0]
 [  0   0   0   0  10]]

 

#3.8构造一个掩模图像,使用按位与运算保留图像中被掩模指定的部分
import cv2
import numpy  as np
a=cv2.imread("lena.bmp",0)
b=np.zeros(a.shape,dtype=np.uint8)

b[100:400,200:400]=255
b[100:500,100:200]=255
c=cv2.bitwise_and(a,b)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()

#3.9构造一个掩模图像,使用按位与操作保留图像内被掩模所指定的部分。
import cv2
import numpy  as np
a=cv2.imread("lena.bmp",1)
b=np.zeros(a.shape,dtype=np.uint8)
b[100:400,200:400]=255
b[100:500,100:200]=255
c=cv2.bitwise_and(a,b)
print("a.shape=",a.shape)
print("b.shape=",b.shape)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()

 

运行结果:

a.shape= (512, 512, 3)

b.shape= (512, 512, 3)

3.4掩模

OPENCV中的很多函数都会指定一个掩模,也被称为掩码,例如:

计算结果=cv2.add(参数1,参数2,掩模)

当使用掩模参数时,操作只会在掩模值为非空的像素点上执行,并将其他像素点的值置为0

例如:

Img1img2img3的原始值分别为:

Img1=

                               

 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 
 

3

 

Img2=

                               

 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 
 

5

 

Mask=

                               

 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

1

 
 

1

 
 

0

 
 

0

 
 

1

 
 

1

 

 

Img3=

                               

 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 

66

 
 
经过img3=cv2.add(img1,img2,mask=mask)运算后,得到img3为:
Img3=

                               

 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

0

 
 

8

 
 

8

 
 

0

 
 

0

 
 

8

 
 

8

 
 
 
#3.10演示掩码的使用过程
import cv2
import numpy as np
img1=np.ones((4,4),dtype=np.uint8)*3
img2=np.ones((4,4),dtype=np.uint8)*5
mask=np.zeros((4,4),dtype=np.uint8)
mask[2:4,2:4]=1
img3=np.ones((4,4),dtype=np.uint8)*66
print("img1=\n",img1)
print("img2=\n",img2)
print("mask=\n",mask)
print("
初始值img3=\n",img3)
img3=cv2.add(img1,img2,mask=mask)
print("
求和后img3=\n",img3)
 
#3.11构造一个掩模图像,将该掩模图像作为按位与函数的掩模参数,实现保留图像的指定部分
import cv2
import numpy  as np
a=cv2.imread("lena.bmp",1)
w,h,c=a.shape

mask=np.zeros((w,h),dtype=np.uint8)
mask[100:400,200:400]=255
mask[100:500,100:200]=255
c=cv2.bitwise_and(a,a,mask)
print("a.shape=",a.shape)
print("mask.shape=",mask.shape)
cv2.imshow("a",a)
cv2.imshow("mask",mask)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()
 
运行结果:
a.shape= (512, 512, 3)
mask.shape= (512, 512)

3.5图像与数值的运算
参与运算的两个参数,既可以是两幅图像也可以是一副图像一副数值,如果想增加图像的整体亮度,可以将每一个像素值都加上特定的值。
 
#3.12演示图像与数值的运算结果
import cv2
import numpy as np
img1=np.ones((4,4),dtype=np.uint8)*3
img2=np.ones((4,4),dtype=np.uint8)*5
print("img1=\n",img1)
print("img2=\n",img2)
img3=cv2.add(img1,img2)
print("cv2.add(img1,img2)=\n",img3)
img4=cv2.add(img1,6)
print("cv2.add(img1,6)\n",img4)
img5=cv2.add(6,img2)
print("cv2.add(6,img2)=\n",img5)
 
运行结果:

img1=

 [[33 3 3]

 [3 33 3]

 [3 33 3]

 [3 33 3]]

img2=

 [[55 5 5]

 [5 55 5]

 [5 55 5]

 [5 55 5]]

cv2.add(img1,img2)=

 [[88 8 8]

 [8 88 8]

 [8 88 8]

 [8 88 8]]

cv2.add(img1,6)

 [[99 9 9]

 [9 99 9]

 [9 99 9]

 [9 99 9]]

cv2.add(6,img2)=

 [[1111 11 11]

 [1111 11 11]

 [1111 11 11]

 [1111 11 11]]