OpenCV图像处理部分基础操作

文章目录

    • 一、图像像素基础操作
      • [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)

高斯滤波特点:

  • 使用高斯函数作为权重函数
  • 离中心像素越近的像素权重越大
  • 能更好地保留图像边缘信息
  • sigmaXsigmaY控制高斯分布的标准差

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()

中值滤波特点:

  • 用邻域像素的中值代替中心像素值
  • 对椒盐噪声有很好的去除效果
  • 能很好地保留图像边缘
  • 对斑点噪声和极值噪声特别有效
相关推荐
阿豪只会阿巴1 天前
【多喝热水系列】从零开始的ROS2之旅——Day5
c++·笔记·python·ubuntu·ros2
叫我:松哥1 天前
基于Spark智能推荐算法的农业作物推荐系统,推荐算法使用Spark ML风格推荐引擎
大数据·python·机器学习·spark-ml·spark·flask·推荐算法
2501_941875281 天前
从日志语义到可观测性的互联网工程表达升级与多语言实践分享随笔
java·前端·python
叫我:松哥1 天前
基于 Flask 的音乐推荐与可视化分析系统,包含用户、创作者、管理员三种角色,集成 ECharts 进行数据可视化,采用混合推荐算法
开发语言·python·信息可视化·flask·echarts·pandas·推荐算法
此剑之势丶愈斩愈烈1 天前
mybatis-plus乐观锁
开发语言·python·mybatis
vibag1 天前
LangGraph全家桶使用
python·语言模型·langchain·大模型·langgraph
勘察加熊人1 天前
python实现批量中英文文件翻译
开发语言·windows·python
飞仔FeiZai1 天前
基于 Python 与 PyQt5 构建的特斯拉行车记录仪视频播放器
python·音视频·qt5
雨大王5121 天前
数字孪生如何助力汽车零部件企业实现柔性生产?
开发语言·人工智能·python