文章目录
-
- 一、图像像素基础操作
-
- [1.1 图像像素打码](#1.1 图像像素打码)
- [1.2 图像区域复制](#1.2 图像区域复制)
- 二、图像缩放操作
-
- [2.1 方法一:直接指定目标尺寸](#2.1 方法一:直接指定目标尺寸)
- [2.2 方法二:通过缩放因子](#2.2 方法二:通过缩放因子)
- 三、图像运算操作
-
- [3.1 基础加法运算(+操作符)](#3.1 基础加法运算(+操作符))
- [3.2 OpenCV加法运算(cv2.add())](#3.2 OpenCV加法运算(cv2.add()))
- [3.3 图像加权运算](#3.3 图像加权运算)
- 四、图像平滑处理
-
- [4.1 椒盐噪声生成函数](#4.1 椒盐噪声生成函数)
- [4.2 均值滤波(Mean Filtering)](#4.2 均值滤波(Mean Filtering))
- [4.3 方框滤波(Box Filtering)](#4.3 方框滤波(Box Filtering))
- [4.4 高斯滤波(Gaussian Filtering)](#4.4 高斯滤波(Gaussian Filtering))
- [4.5 中值滤波(Median Filtering)](#4.5 中值滤波(Median Filtering))
一、图像像素基础操作
1.1 图像像素打码
python
import cv2
import numpy as np
# 读取图片
a = cv2.imread(r"picture_1.jpg")
# 打码操作:将图像a中第100到200行,第200到300列的像素区域替换
# np.random.randint(0,256,(100,100,3)) 生成一个100x100x3的数组,值在[0, 256)之间,模拟随机颜色像素
a[400: 800, 400: 800] = np.random.randint(0, 256, (400, 400, 3))
cv2.imshow('picture_1', a)
cv2.waitKey(0)
cv2.destroyAllWindows()
参数分析:
a[400:800, 400:800]:图像切片操作,选取图像中特定矩形区域(行400-799,列400-799)np.random.randint(0, 256, (400, 400, 3)):生成400×400×3的随机像素矩阵,每个像素值在0-255之间

1.2 图像区域复制
python
# 图片组合:将图片a的一部分覆盖到图片b的对应位置
a = cv2.imread(r"picture_1.jpg")
b = cv2.imread(r"picture_2.jpg")
b[400:800, 400:800] = a[400:800, 400:800] # 注意:两侧矩阵的切片大小必须完全一致
cv2.imshow('a', a)
cv2.imshow('b', b)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键点:
- 两侧矩阵切片大小必须完全一致
- 操作直接修改目标图像的像素值
二、图像缩放操作
2.1 方法一:直接指定目标尺寸
python
# 图片缩放:方法一,直接指定目标尺寸
a = cv2.imread(r"picture_1.jpg")
a_new = cv2.resize(a,(800,800)) # 将图片缩放至宽600像素,高200像素
cv2.imshow( 'a1',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
2.2 方法二:通过缩放因子
python
# 图片缩放:方法二,通过缩放因子
a_new = cv2.resize(a, dsize=None, fx=1.5, fy=0.5) # 宽度变为1.5倍,高度变为0.5倍
cv2.imshow( 'a1',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.resize()参数分析:
dsize:目标图像尺寸,格式为(宽度, 高度)fx:水平方向的缩放因子fy:垂直方向的缩放因子- 当
dsize和缩放因子同时指定时,dsize参数优先

三、图像运算操作
3.1 基础加法运算(+操作符)
python
# 图像加法运算
# 对于+号运算,当对图像a,图像b进行加法求和时,遵循以下规则:
# 当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
# 当某位置像素相加得到的数值大于255时,该位置数值将截断结果并将其减去 256 例如:相加后是260,实际是260-256=4
a = cv2.imread(r"picture_1.jpg")
b = cv2.imread(r"picture_2.jpg")
c = a + 10 # 图片
cv2.imshow('yuan', a)
cv2.imshow('a+10', c)
cv2.waitKey(0)
c = a[400:800, 400:800] + b[400:800, 400:800]
cv2.imshow('a+b', c)
cv2.waitKey(0)
运算规则:
- 像素值使用模256运算(溢出处理)
- 适用于需要循环颜色效果的情况
3.2 OpenCV加法运算(cv2.add())
python
# 对于cv2.add()运算,当对图像a,图像b进行加法求和时,遵循以下规则:
# 当某位置像素相加得到的数值小于255时,该位置数值为两图像该位置像素相加之和
# 当某位置像素相加得到的数值大于255时,该位置数值为255
a = cv2.imread(r"picture_1.jpg")
b = cv2.imread(r"picture_2.jpg")
b = cv2.resize(b, (400, 400))
a = cv2.resize(a, dsize=(400, 400))
c = cv2.add(a, b) # 也可以使用使用
cv2.imshow('a add b', c)
cv2.waitKey(0)
运算规则:
- 像素值饱和处理(最大值为255)
- 更符合视觉预期,避免颜色突变
3.3 图像加权运算
python
# 图像加权运算
# 就是在计算两幅图像的像素值之和时,将每幅图像的权重考虑进来,可以用公式表示为dst=src1×α+src2×β+γ
a = cv2.imread(r"picture_1.jpg")
b = cv2.imread(r"picture_2.jpg")
b = cv2.resize(b, dsize=(400, 400))
a = cv2.resize(a, dsize=(400, 400))
#
c = cv2.addWeighted(a, 0.5, b, 0.5, 10) # 10:图像的亮度值(常数),将添加到加权和上
cv2.imshow('addWeighted', c)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.addWeighted()参数分析:
src1:第一幅输入图像alpha:第一幅图像的权重系数src2:第二幅输入图像beta:第二幅图像的权重系数gamma:添加到加权和上的亮度值- 计算公式:
dst = src1 × alpha + src2 × beta + gamma

四、图像平滑处理
4.1 椒盐噪声生成函数
python
def add_peppersalt_noise(image, n=10000):
result = image.copy()
h, w = image.shape[:2] # 获取图片的高和宽
for i in range(n): # 生成n个椒盐噪声
x = np.random.randint(0, h)
y = np.random.randint(0, w)
if np.random.randint(0, 2) == 0:
result[x, y] = 0
else:
result[x, y] = 255
return result
image = cv2.imread(r"picture_1.jpg")
cv2.imshow('yuan', image)
cv2.waitKey(0)
noise = add_peppersalt_noise(image)
cv2.imshow('noise', noise)
cv2.waitKey(0)
4.2 均值滤波(Mean Filtering)
python
# 1、均值滤波 blur
blur_1 = cv2.blur(noise, (3, 3)) # 卷积核为3,3 效果一般,清晰度一般
cv2.imshow('blur_1', blur_1)
cv2.waitKey(0)
blur_2 = cv2.blur(noise, (63, 63))
cv2.imshow('blur_2', blur_2)
cv2.waitKey(0)
cv2.blur()参数分析:
src:需要处理的源图像ksize:滤波核大小,格式为(宽度, 高度)- 原理:用卷积核内所有像素的平均值代替中心像素值
- 特点:简单快速,但会模糊图像边缘
4.3 方框滤波(Box Filtering)
python
# dst=cv2.boxFilter(src,ddepth,ksize,anchor,normalize,borderType)式中:
# dst是返回值,表示进行方框滤波后得到的处理结果。
# src 是需要处理的图像,即原始图像。
# ddepth是处理结果图像的图像深度,一般使用-1表示与原始图像使用相同的图像深度。(可以理解为数据类型)
# ksize 是滤波核的大小。滤波核大小是指在滤波处理过程中所选择的邻域图像的高 度和宽度。
# anchor 是锚点,(指对应哪个区域)
# normalize 表示在滤波时是否进行归一化。
# 1.当值为True时,归一化,用邻域像素值的和除以面积。 此时方框滤波与 均值滤波 效果相同。
# 2.当值为False时,不归一化,直接使用邻域像素值的和。和>255时使用255
boxFilter_1 = cv2.boxFilter(noise, -1, ksize=(3, 3), normalize=True) # 2、方框滤波
cv2.imshow('boxFilter_1', boxFilter_1)
cv2.waitKey(0)
boxFilter_2 = cv2.boxFilter(noise, -1, ksize=(3, 3), normalize=False)
cv2.imshow('boxFilter_2', boxFilter_2)
cv2.waitKey(0)
cv2.boxFilter()关键参数:
normalize=True:与均值滤波效果相同(进行归一化)normalize=False:直接对邻域像素求和,可能产生过亮区域
4.4 高斯滤波(Gaussian Filtering)
python
# cv2.GaussianBlur(src, ksize[, sigmaX[, sigmaY[, dst]]])高斯滤波
# 参数说明:
# src:输入图像,通常是一个NumPy数组。
# ksize:滤波器的大小,它是一个元组,表示在水平和垂直方向上的像素数量。例如,(5, 5)表示一个5x5的滤波器。
# sigmaX和sigmaY:分别表示在X轴和Y轴方向上的标准差。这些值与滤波器大小相同。默认情况下,它们都等于0,这意味着没有高斯模糊。
# dst:输出图像,通常是一个NumPy数组。如果为None,则会创建一个新的数组来存储结果。
GaussianB = cv2.GaussianBlur(noise, ksize=(3, 3), sigmaX=1) # 3、高斯滤波
cv2.imshow('GaussianBlur', GaussianB)
cv2.waitKey(0)
高斯滤波特点:
- 使用高斯函数作为权重函数
- 离中心像素越近的像素权重越大
- 能更好地保留图像边缘信息
sigmaX和sigmaY控制高斯分布的标准差
4.5 中值滤波(Median Filtering)
python
# cv2.medianBlur(src, ksize[, dst]])中值滤波
# 参数说明:
# src:输入图像。
# ksize:滤波器的大小,它是一个整数,表示在水平和垂直方向上的像素数量。例如,5表示一个5x5的滤波器。
# dst:输出图像,通常是一个NumPy数组。如果为None,则会创建一个新的数组来存储结果。
medianB = cv2.medianBlur(noise, ksize=3) # 4、中值滤波
cv2.imshow('medianBlur', medianB)
cv2.waitKey(0)
cv2.destroyAllWindows()
中值滤波特点:
- 用邻域像素的中值代替中心像素值
- 对椒盐噪声有很好的去除效果
- 能很好地保留图像边缘
- 对斑点噪声和极值噪声特别有效
