图片的基本操作

server/2025/2/12 19:17:14/

1.1. 图片基本操作

1.1.1. 图片读取

使用 cv2.imread() 函数可以读取图片文件。OpenCV 默认以 BGR 格式读取彩色图像。

python">import cv2# 读取图片
image = cv2.imread("example.jpg")  # 读取彩色图像
# image = cv2.imread("example.jpg", cv2.IMREAD_GRAYSCALE)  # 读取灰度图像
# image = cv2.imread("example.jpg", cv2.IMREAD_UNCHANGED)  # 读取包含透明通道的图像if image is None:print("Error: Could not read the image.")
else:print("Image loaded successfully.")

1.1.2. 图片显示

使用 cv2.imshow() 函数可以显示图片。

python">cv2.imshow("Image", image)  # 显示图片
cv2.waitKey(0)  # 等待用户按键(0 表示无限等待)
cv2.destroyAllWindows()  # 关闭所有窗口

使用 matplotlib.pyplot

  • 功能matplotlib.pyplot 是一个强大的绘图库,可以用来显示图像,并支持更多的绘图功能。
  • 适用场景
    • 适用于需要在 Jupyter Notebook 或其他支持 matplotlib 的环境中显示图像的情况。
    • 适用于需要对图像进行更复杂的可视化(如添加标题、坐标轴、注释等)的情况。
python">import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread("image.jpg")# 显示图像
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Image")
plt.xlabel("X-axis")
plt.ylabel("Y-axis")
plt.show()

两者差异:

matplotlib.pyplot:

  • 所属库matplotlib 是一个强大的绘图库,广泛用于数据可视化。
  • 特点
    • 主要用于绘制图表、图形和图像,支持丰富的绘图功能。
    • 支持显示多种类型的图像,包括灰度图、彩色图等。
    • 可以添加标题、坐标轴、注释等。
    • 适合在 Jupyter Notebook 或其他支持 matplotlib 的环境中使用。
  • 适用场景
    • 数据分析和可视化。
    • 在 Jupyter Notebook 中快速显示图像。
    • 需要对图像进行标注、绘制图形或与其他数据可视化内容结合。

cv2.imshow:

  • 所属库OpenCV 是一个专注于计算机视觉和图像处理的库。
  • 特点
    • 专门用于显示图像,支持实时显示和处理。
    • 提供了简单的窗口管理功能,如调整窗口大小、移动窗口等。
    • 支持键盘和鼠标事件,方便与用户交互。
    • 适合在本地运行的脚本中使用。
  • 适用场景
    • 图像处理和计算机视觉任务。
    • 实时显示图像处理结果。
    • 需要与用户交互(如按键退出、鼠标点击等)。

结论:如果需要用户交互则用cv2.imshow(),如果需要标注坐标系则用matlpltlib.pyplot

1.1.3. 图片保存

使用 cv2.imwrite() 函数可以将处理后的图像保存到文件。

python">cv2.imwrite("output.jpg", image)  # 保存图像
print("Image saved successfully.")

1.1.4. 图片属性获取

可以获取图片的尺寸、通道数、数据类型等信息。

不同格式shpe信息有所差异

BGR/RGB格式的 shape为(Height,Width,Channels)

灰度图像的shape为(Height,Width)

python">height, width = image.shape[:2]  # 获取图像的高和宽
print(f"Height: {height}, Width: {width}")if len(image.shape) == 3:  # 彩色图像channels = image.shape[2]print(f"Channels: {channels}")
else:  # 灰度图像print("Channels: 1")print(f"Data type: {image.dtype}")

1.1.5. 图片大小调整

  • 调整大小:使用 cv2.resize() 改变图像尺寸,放大缩小与裁剪不同。
python">resized_image = cv2.resize(image, (800, 600))  # 调整为固定尺寸
# resized_image = cv2.resize(image, None, fx=0.5, fy=0.5)  # 按比例缩放

1.1.6. 图片裁剪

  • 裁剪:在上一节了解到图片是保存在Numpy数组中故通过 NumPy 的切片操作实现。
python">cropped_image = image[100:500, 200:700]  # 裁剪图像 高100-500 宽200-700的区域

1.1.7. 图片旋转

  • 旋转
    • 使用 cv2.rotate()
      • 用于以 90 度的倍数旋转图像。该函数使用 rotateCode 参数以三种不同的方式旋转图像。cv2.rotate() 函数有两个主要的参数:srcrotateCode。其中,src 是输入图像(源图像),它是一个 NumPy 数组。rotateCode 是旋转的类型,指定旋转的方向和角度。常见的值包括:
        • cv2.ROTATE_90_CLOCKWISE:顺时针旋转 90 度。
        • cv2.ROTATE_180:旋转 180 度。
        • cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转 90 度。
python">import cv2# 读取图片
img = cv2.imread('wechat.jpg')
# 修改图片大小(可选)
img = cv2.resize(img, dsize=None, fx=0.3, fy=0.3)rotated_image = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE)  # 顺时针90度
rotated_image1 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)  # 逆时针90度
rotated_image2 = cv2.rotate(img, cv2.ROTATE_180)  # 旋转180度# 显示图片
cv2.imshow('shun90', rotated_image)
cv2.imshow('ni90', rotated_image1)
cv2.imshow('180', rotated_image2)# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
    • 自定义旋转矩阵。
      • 计算旋转矩阵:cv2.getRotationMatrix2D
        • 使用 cv2.getRotationMatrix2D 计算旋转矩阵,参数分别是旋转中心、旋转角度和缩放因子(这里为 1.0,表示不缩放)。
      • 应用旋转矩阵:cv2.warpAffine
        • 使用 cv2.warpAffine 应用旋转矩阵到图像上,参数分别是输入图像、旋转矩阵和输出图像的尺寸。
python">import cv2
import numpy as np# 读取图像
image = cv2.imread('path_to_image.jpg')angle = 45  # 旋转 45 度# 获取图像尺寸
(height, width) = image.shape[:2]# 计算旋转中心 整除
center = (width // 2, height // 2) # 计算旋转矩阵 旋转中心,旋转角,缩放比例1.0表示不变
rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)# 应用旋转 图片源,旋转矩阵,目标尺寸
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))# 显示原始图像和旋转后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Rotated Image', rotated_image)# 等待任意键按下后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

1.1.8. 图片翻转

  • 翻转:使用 cv2.flip(),可以实现三种翻转如下:
python">flipped_image = cv2.flip(image, 1)  # 水平翻转
# flipped_image = cv2.flip(image, 0)  # 垂直翻转
# flipped_image = cv2.flip(image, -1)  # 水平垂直翻转

1.2. 图像的基本处理

1.2.1. 灰度化

  • 介绍:图像的灰度化是图像处理中一种常见的预处理技术,它将彩色图像转换为灰度图像。灰度图像只有一个亮度通道,通常表示为从黑到白的灰度值。
  • 灰度化:使用 cv2.cvtColor() 将彩图转换为灰度图。
  • 功能及应用场景:
    1. 简化数据
      彩色图像通常包含三个通道(如 RGB 或 BGR),而灰度图像只有一个通道。灰度化可以显著减少数据量,简化后续处理步骤。
    2. 降低计算复杂度
      由于灰度图像的数据量较少,处理灰度图像通常比处理彩色图像更快,计算复杂度更低。这对于需要实时处理的应用(如视频分析、实时监控等)尤为重要。
    3. 特征提取
      在许多计算机视觉任务中,如边缘检测、纹理分析等,灰度图像已经足够提取有用的特征。灰度化可以去除颜色信息,使算法专注于亮度和对比度等特征。
    4. 兼容性
      某些图像处理算法和库可能只支持灰度图像。将彩色图像转换为灰度图像可以提高算法的兼容性。
    5. 提高算法性能
      在某些情况下,灰度图像可以提高算法的性能和准确性。例如,在人脸识别中,灰度图像可以减少颜色变化带来的干扰,提高识别率。
    6. 数据增强
      在机器学习和深度学习中,灰度化可以作为一种数据增强技术,增加模型的泛化能力。
    7. 艺术效果
      在艺术和设计领域,灰度图像可以产生独特的视觉效果,如复古风格、高对比度等。
python">gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

1.2.2. 颜色通道分离与合并:

  • 水印嵌入:在图像水印嵌入中,可以分别在每个颜色通道中嵌入水印,以提高水印的鲁棒性。

python"># b, g, r = cv2.split(image)  # 分离通道
# merged_image = cv2.merge([b, g, r])  # 合并通道import cv2
import matplotlib.pyplot as plt# 读取图像
image = cv2.imread("Cat.jpg")# 分离通道
b, g, r = cv2.split(image)# 显示原始图像
plt.figure(figsize=(12, 6))
plt.subplot(2, 2, 1)
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.title("Original Image")
plt.axis("off")# 显示蓝色通道
plt.subplot(2, 2, 2)
plt.imshow(b, cmap='gray')
plt.title("Blue Channel")
plt.axis("off")# 显示绿色通道
plt.subplot(2, 2, 3)
plt.imshow(g, cmap='gray')
plt.title("Green Channel")
plt.axis("off")# 显示红色通道
plt.subplot(2, 2, 4)
plt.imshow(r, cmap='gray')
plt.title("Red Channel")
plt.axis("off")# 合并通道 注意顺序为BGR
merged_image = cv2.merge([b, g, r])# 显示合并后的图像
plt.figure(figsize=(6, 6))
plt.imshow(cv2.cvtColor(merged_image, cv2.COLOR_BGR2RGB))
plt.title("Merged Image")
plt.axis("off")plt.show()


http://www.ppmy.cn/server/167128.html

相关文章

肝了半年,我整理出了这篇云计算学习路线(新手必备,从入门到精通)

大家好!我是凯哥,今天给大家分享一下云计算学习路线图。这是我按照自己最开始学习云计算的时候的学习路线,并且结合自己从业多年所涉及的知识精心总结的云计算的思维导图。这是凯哥精心总结的,花费了不少精力哦,希望对…

PDF 文件的安全功能概述

由于安全问题始终存在,我们希望重点介绍 PDF 文件格式提供的一些安全功能。如果您希望控制或限制用户可以执行的操作,这些功能可以启用。本文将介绍可以阻止哪些类型的操作,以及可以实施哪些不同的身份验证技术来提高 PDF 的安全性。 可以控制…

DeepSeek r1本地安装全指南

环境基本要求 硬件配置 需要本地跑模型,兼顾质量、性能、速度以及满足日常开发需要,我们需要准备以下硬件: CPU:I9内存:128GB硬盘:3-4TB 最新SSD,C盘确保有400GB,其它都可划成D盘…

链表分割-双哨兵位

题目 现有一链表的头指针struct ListNode* pHead,给一定值x,编写一段代码将所有小于x的节点排在其余节点之前,且不能改变原来数据顺序,返回重新排列后的链表的头指针 示例: pHead [1,5,2,7,3,4], x5 输出 [1,2,3,4,5…

深入解析:如何利用 Python 爬虫获取商品 SKU 详细信息

在电商领域,SKU(Stock Keeping Unit,库存单位)详细信息是电商运营的核心数据之一。它不仅包含了商品的规格、价格、库存等关键信息,还直接影响到库存管理、价格策略和市场分析等多个方面。本文将详细介绍如何利用 Pyth…

我用AI做数据分析之数据清洗

我用AI做数据分析之数据清洗 AI与数据分析的融合效果怎样? 这里描述自己在使用AI进行数据分析(数据清洗)过程中的几个小故事: 1. 变量名的翻译 有一个项目是某医生自己收集的数据,变量名使用的是中文,分…

Unity Shader Graph 2D - Procedural程序化形状之波形

在Unity Shader Graph中,可以通过节点来构建一些程序化的图形形状,本文将通过使用Shader Graph中的节点来创建一个圆状的波形动画图形,从而进一步的来实践和应用Shader Graph的节点。 创建基础的圆状波形图 需要使用到的节点有Polar Coordinates即极坐标,该坐标以半径为X轴…

面试经典150题——字典树

文章目录 1、实现 Trie (前缀树)1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、添加与搜索单词 - 数据结构设计2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词搜索 II3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 对于字典树而言,之前做过…