注:本博客中存在的所以图片路径都是电脑中图片所在位置的路径,想要使用,要修改成自己图像的路径后再使用
1、图像打码
1)切片部分 a[0:80, 50:130]
-
0:80:从第0行到第79行(共80行) -
50:130:从第50列到第129列(共80列) -
实际上没有写第三个维度(颜色通道),所以默认选择所有颜色通道
-
这个切片的大小是 80行 × 80列 × 3个颜色通道
2)np.random.randint() 参数
np.random.randint(0, 256, (80, 80, 3))
三个参数分别是:
-
0:随机数的下限(包含) -
256:随机数的上限(不包含),所以实际生成 0-255 的整数 -
(80, 80, 3):输出数组的形状-
80:高度 -
80:宽度 -
3:颜色通道数(通常对应 RGB)
-
python
import cv2
import numpy as np
# 对图片进行打码
a = cv2.imread(r'./true.png')
a[0:80,50:130] = np.random.randint(0,256,(80,80,3))# 矩阵赋值必须是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、图片组合
b[120:200,200:280] = a[0:80,100:180]
注:这里矩阵大小必须要统一,并且范围要比原图像尺寸更小
python
import cv2
a = cv2.imread('true.png')
b = cv2.imread('ky.png')
b[120:200,200:280] = a[0:80,100:180]# 矩阵大小必须要统一
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、图像缩放 cv2.resize
1)a_new = cv2.resize(a,(400,300))
这是一个 OpenCV的图像缩放操作,用于改变图像的尺寸
(1) a
-
输入图像:可以是NumPy数组或图像文件路径
-
通常是一个三维数组(彩色图像)或二维数组(灰度图像)
(2)(400, 300)
-
目标尺寸:
(宽度, 高度) -
重要:OpenCV使用
(宽度, 高度)顺序,而NumPy数组使用(高度, 宽度)顺序 -
400:新图像的宽度(列数) -
300:新图像的高度(行数)
(3)返回值 a_new
-
缩放后的新图像数组
-
不改变原图像
a,而是创建一个副本
2)a1_new = cv2.resize(a,dsize=None,fx=2,fy=2)
这是一个 OpenCV使用缩放因子的图像放大操作,它按比例放大图像而不是指定具体尺寸。
(1)dsize=None
-
目标尺寸设为None:表示不直接指定具体宽度和高度
-
这样OpenCV会使用
fx和fy参数来计算新尺寸
(2)fx=2
-
水平方向(X轴)缩放因子 = 2
-
新宽度 = 原宽度 × 2
-
宽度变为原来的 2倍
(3) fy=2
-
垂直方向(Y轴)缩放因子 = 2
-
新高度 = 原高度 × 2
-
高度变为原来的 2倍
(4)返回值 a1_new
-
放大后的新图像
-
保持原图的宽高比(因为是等比例缩放)
-
创建的是副本,原图
a不变
python
import cv2
a = cv2.imread('true.png')
# b = cv2.imread('xiaomao.jpg')
a_new = cv2.resize(a,(400,300))
# b_new = cv2.resize(b,(400,300))
a1_new = cv2.resize(a,dsize=None,fx=2,fy=2)
cv2.imshow('a',a)
# cv2.imshow('b',b)
cv2.imshow('a_new',a_new)
# cv2.imshow('b_new',b_new)
cv2.imshow('a1_new',a1_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.imwrite('true_1.png',a)
# cv2.imwrite('xiaomao_1.png',b)

4、图像运算
1)加号运算
对于+号运算,当对图像a,图像b进行加法求和时,遵循以下规则:
当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
当某位置像素相加得到的数值大于255时,该位置数值將截断结果并将其减去256 例如:相加后是260,实际是260-256=4
python
import cv2
a = cv2.imread('true_1.png')
b = cv2.imread('ky_1.png')
c = a+30
cv2.imshow('yuan',a)
cv2.imshow('a+30',c)
cv2.waitKey(0)
i = a[50:200,50:200]+b[50:200,50:200]
cv2.imshow('a+b',i)
cv2.waitKey(0)

可以看到修改后的图颜色发生了变化
2)cv2.add()运算
对于cv2.add()运算,当对图像a,图像b进行加法求和时,遵循以下规则:
当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
当某位置像素相加得到的数值大于255时,該位置数值为255
python
import cv2
a = cv2.imread('true_1.png')
b = cv2.imread('ky_1.png')
b = cv2.resize(b, (300,300))
a = cv2.resize(a, (300,300))
c = cv2.add(a,b)
cv2.imshow('a add b',c)
cv2.waitKey(0)
cv2.destroyAllWindows()

3)图像加权运算
就是在计算两幅图像的像素值之和时,將每幅图像的权重考虑进来,可以用公式表示为dst=src1xa+srcxB+Y
python
import cv2
a = cv2.imread('true_1.png')
b = cv2.imread('ky_1.png')
b = cv2.resize(b, (300,300))
a = cv2.resize(a, (300,300))
c = cv2.addWeighted(a, 0.5, b, 0.5, 10)#10是图像的亮度值
cv2.imshow('add',c)
cv2.waitKey(0)
cv2.destroyAllWindows()

5、阈值处理
阈值处理是指剔除图像内像素值高于一定值或低于一定值的像素点。使用的方法为:
retval,dst=cv2.threshold(src,thresh,maxval,type)
retval代表返回的阈值
dst代表阈值分割结果图像,与原始图像具有相同的大小和类型
src代表要进行阈值分割的图像,可以是多通道的,8位或32位浮点型数值
thresh代表要设定的阈值
maxval代表type参数位THRESH_BINARY或者THRESH_BINARY_INV类型I时,需要设定的最大值
type代表阈值分割的类型,具体内容如下表所示:
选项 像素值>thresh 其他情况
CV2.THRESH_BINARY maxval 0
CV2.THRESH_BINARY_INV 0 maxval
CV2.THRESH_TRUNC thresh 当前灰度值
CV2.THRESH_TOZERO 当前灰度值 0
CV2.THRESH_TOZERO_INV 0 当前灰度值
1)阈值处理灰度图版
python
import cv2
ayuan=cv2.imread('xiaomao.jpg',0)#将0删去,就变成彩色版
a = cv2.resize(ayuan,dsize=None,fx=0.3,fy=0.3)
ret,a1=cv2.threshold(a,175,255,cv2.THRESH_BINARY)
ret,a2=cv2.threshold(a,175,255,cv2.THRESH_BINARY_INV)
ret,a3=cv2.threshold(a,175,255,cv2.THRESH_TRUNC)
ret,a4=cv2.threshold(a,175,255,cv2.THRESH_TOZERO)
ret,a5=cv2.threshold(a,175,255,cv2.THRESH_TOZERO_INV)
cv2.imshow('gray',a)#原灰度图
# cv2.waitKey(0)
cv2.imshow('binary',a1)#偏白的变纯白,偏黑的变纯黑
# cv2.waitKey(0)
cv2.imshow('binary_inv',a2)#偏白的变纯黑,偏黑的变纯白
# cv2.waitKey(0)
cv2.imshow('triangle',a3)#偏白的变成阈值所设的颜色,偏黑的不变
# cv2.waitKey(0)
cv2.imshow('tozero',a4)#偏白的不变,偏黑的变成纯黑
# cv2.waitKey(0)
cv2.imshow('tozero_inv',a5)#偏白的变纯黑,偏黑的不变
cv2.waitKey(0)
cv2.destroyAllWindows()

2)阈值处理彩色版一
将灰度图版代码中ayuan=cv2.imread('xiaomao.jpg',0)中的0删去即可,即
python
import cv2
ayuan=cv2.imread('xiaomao.jpg')
a = cv2.resize(ayuan,dsize=None,fx=0.3,fy=0.3)
ret,a1=cv2.threshold(a,175,255,cv2.THRESH_BINARY)
ret,a2=cv2.threshold(a,175,255,cv2.THRESH_BINARY_INV)
ret,a3=cv2.threshold(a,175,255,cv2.THRESH_TRUNC)
ret,a4=cv2.threshold(a,175,255,cv2.THRESH_TOZERO)
ret,a5=cv2.threshold(a,175,255,cv2.THRESH_TOZERO_INV)
cv2.imshow('gray',a)
# cv2.waitKey(0)
cv2.imshow('binary',a1)
# cv2.waitKey(0)
cv2.imshow('binary_inv',a2)
# cv2.waitKey(0)
cv2.imshow('triangle',a3)
# cv2.waitKey(0)
cv2.imshow('tozero',a4)
# cv2.waitKey(0)
cv2.imshow('tozero_inv',a5)
cv2.waitKey(0)
cv2.destroyAllWindows()

3)阈值处理彩色版2
就是将3个通道都进行阈值处理
python
'''阈值处理、彩色版另一种方法'''
import cv2
# 读取彩色图片
ayuan = cv2.imread('xiaomao.jpg')
a = cv2.resize(ayuan, dsize=None, fx=0.3, fy=0.3)
cv2.imshow('yuan',a)
# 分别对B、G、R三个通道应用阈值
b, g, r = cv2.split(a)
ret, b1 = cv2.threshold(b, 175, 255, cv2.THRESH_BINARY)
ret, g1 = cv2.threshold(g, 175, 255, cv2.THRESH_BINARY)
ret, r1 = cv2.threshold(r, 175, 255, cv2.THRESH_BINARY)
ret, b2 = cv2.threshold(b, 175, 255, cv2.THRESH_BINARY_INV)
ret, g2 = cv2.threshold(g, 175, 255, cv2.THRESH_BINARY_INV)
ret, r2 = cv2.threshold(r, 175, 255, cv2.THRESH_BINARY_INV)
ret, b3 = cv2.threshold(b, 175, 255, cv2.THRESH_TRUNC)
ret, g3 = cv2.threshold(g, 175, 255, cv2.THRESH_TRUNC)
ret, r3 = cv2.threshold(r, 175, 255, cv2.THRESH_TRUNC)
ret, b4 = cv2.threshold(b, 175, 255, cv2.THRESH_TOZERO)
ret, g4 = cv2.threshold(g, 175, 255, cv2.THRESH_TOZERO)
ret, r4 = cv2.threshold(r, 175, 255, cv2.THRESH_TOZERO)
ret, b5 = cv2.threshold(b, 175, 255, cv2.THRESH_TOZERO_INV)
ret, g5 = cv2.threshold(g, 175, 255, cv2.THRESH_TOZERO_INV)
ret, r5 = cv2.threshold(r, 175, 255, cv2.THRESH_TOZERO_INV)
# 合并通道
a1_color = cv2.merge([b1, g1, r1])
cv2.imshow('a1',a1_color)
a2_color = cv2.merge([b2, g2, r2])
cv2.imshow('a2',a2_color)
a3_color = cv2.merge([b3, g3, r3])
cv2.imshow('a3',a3_color)
a4_color = cv2.merge([b4, g4, r4])
cv2.imshow('a4',a4_color)
a5_color = cv2.merge([b5, g5, r5])
cv2.imshow('a5',a5_color)
cv2.waitKey(0)
cv2.destroyAllWindows()

6、图像平滑处理
图像平滑(smoothing)也称为"模糊处理"(bluring)
通过消除图像中的噪声或细节来使图像看起来更为模糊,从而实现平滑效果
可以用来压制、弱化、消除图像中的细节、突变和噪声。
下面是常用的一些滤波器
均值滤波(邻域平均滤波)->blUr函数
方框滤波->boxFilter函数
高斯滤波->GaussianBlur函数
中值滤波->medianBlur函数
dst=cv2.blur(src, ksize,anchor,borderType)
dst是返回值
src是需要处理的图像
kszie是滤波核(卷积核)的大小
anchor是锚点,默认值是(-1,-1)一般无需更改
borderType是边界样式,一般无需更改
一般情况下,使用dst=cv2.blur(src,ksize)即可


python
import cv2
import numpy as np
# 定义添加椒盐噪声的函数
def Noise(a, n=10000):
b = a.copy() # 创建图像的副本,避免修改原图
h, w = a.shape[:2] # 获取图片的高和宽,shape返回(高度, 宽度, 通道数)
for i in range(n): # 循环n次,添加n个噪声点
x = np.random.randint(0, h) # 随机生成行坐标(0到h-1之间)
y = np.random.randint(0, w) # 随机生成列坐标(0到w-1之间)
if np.random.randint(0, 2) == 0: # 随机生成0或1,50%概率
b[x, y] = 0 # 设置为黑色像素(椒噪声)
else:
b[x, y] = 255 # 设置为白色像素(盐噪声)
return b # 返回添加噪声后的图像
# 读取原始图像
ayuan = cv2.imread('peopleone.jpg') # 从文件读取图像,注意确保文件路径正确
# 将图像缩小到原图的40%(等比例缩放)
a = cv2.resize(ayuan, dsize=None, fx=0.4, fy=0.4)
# 显示原始缩放后的图像
cv2.imshow('yuan', a) # 在名为'yuan'的窗口中显示图像a
# 添加椒盐噪声
noise = Noise(a) # 调用Noise函数,添加10000个噪声点
cv2.imshow('noise', noise) # 显示添加噪声后的图像
# 使用均值滤波(方框滤波的特殊形式)
blur1 = cv2.blur(noise, (3, 3)) # 3×3均值滤波,核大小为3×3
cv2.imshow('blur1', blur1) # 显示滤波结果
blur2 = cv2.blur(noise, (7, 7)) # 7×7均值滤波,核更大,平滑效果更强
cv2.imshow('blur2', blur2) # 显示滤波结果
cv2.waitKey(0) # 等待按键,0表示无限等待
# cv2.destroyAllWindows() # 注释掉了,所以窗口不会关闭
# 使用方框滤波
box_1 = cv2.boxFilter(noise, -1, (3, 3), normalize=True) # 归一化的3×3方框滤波
# -1: 输出图像深度与输入相同
# normalize=True: 进行归一化,等价于均值滤波
cv2.imshow('box_1', box_1) # 显示滤波结果
box_2 = cv2.boxFilter(noise, -1, (3, 3), normalize=False) # 非归一化的3×3方框滤波
# normalize=False: 不进行归一化,直接求和,可能产生过亮像素
cv2.imshow('box_2', box_2) # 显示滤波结果
# 使用高斯滤波
gau = cv2.GaussianBlur(noise, (3, 3), 1) # 3×3高斯滤波,标准差为1
# 高斯滤波根据距离中心点的远近给予不同权重,中心权重最大
cv2.imshow('gau', gau) # 显示滤波结果
# 使用中值滤波
med = cv2.medianBlur(noise, 3) # 3×3中值滤波,取邻域内像素值的中位数
# 对椒盐噪声特别有效,能更好地保留边缘信息
cv2.imshow('med', med) # 显示滤波结果
cv2.waitKey(0) # 再次等待按键
cv2.destroyAllWindows() # 关闭所有OpenCV创建的窗口
