图像处理基础操作(OpenCV Pycharm Python)

1、图片的加载

2:图像的矩阵表示

3:图片的灰度化(使用Pillow)

4:灰度翻转

5:图像的仿射变换

1.  线性变换

2.  平移

3. cv2.getRotationMatrix2D

6:对数变换

7:伽马变换

8:直方图均衡化-----cv2.equalizeHist

9:未完待续。。


1、图片的加载

# 导入OpenCV库
import cv2

# 读取图像文件
# imread()函数用于从指定路径加载图像
image = cv2.imread('D:\\Torch\\Picture\\monkey.png')

# 检查图像是否成功加载
# 如果图像未加载成功,imread()会返回None
if image is None:
    print("Error: Unable to load image.")
else:
    print("Image loaded successfully.")

# 显示图像
# imshow()函数用于在窗口中显示图像
cv2.imshow('Loaded Image', image)

# 等待用户按任意键关闭窗口
# waitKey(0)表示无限等待,直到用户按键
cv2.waitKey(0)

RGB 颜色模型

  • RGB 颜色模型 是一种基于加法混色的颜色表示法,用于在电子显示器、数字图像、传感器等中表示颜色。
  • 每个像素的 RGB 值 包含三个分量,每个分量通常用一个 8 位整数表示,因此每个分量的值范围是 0 到 255。

2:图像的矩阵表示

灰度图像:如果图像是灰度图像(即黑白图像),那么它可以表示为一个二维矩阵。矩阵的每个元素对应图像中的一个像素点,元素的值表示该像素点的灰度值(通常在 0 到 255 之间),0 表示黑色,255 表示白色,中间的值表示不同的灰度级别。

eg:图像分辨率:宽*高=500*480

灰度图像→二维矩阵→csv文件:500列 480行→每一个单元格对应一个像素

彩色图像:如果图像是彩色图像(如 RGB 图像),则它可以表示为一个三维矩阵。这个三维矩阵由三个二维矩阵组成,每个二维矩阵分别表示红色(R)、绿色(G)、蓝色(B)通道的值。每个通道矩阵的大小与图像的分辨率相同。每个通道的矩阵值范围通常也是 0 到 255,表示对应颜色通道的强度。


3:图片的灰度化(使用Pillow)

image_path = 'D:\\Torch\\Picture\\monkey.png'

# 打开彩色图像
color_image = Image.open(image_path)

# 将彩色图像转换为灰度图像
gray_image = color_image.convert('L')
# Gray=0.299×R+0.587×G+0.114×B

# 将灰度图像转换为二维矩阵
gray_image = np.array(gray_image)
print(f"图像数据类型: {gray_image.dtype}")

cv2.imwrite('D:\\Torch\\Picture\\Monkey_gray.jpg', gray_image)
print("图片已保存")

# 保存灰度矩阵为CSV文件
with open('D:\\Torch\\Picture\\monkey_gray_matrix.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    writer.writerows(gray_image)

Pillow库在进行灰度化转换时,使用的是以下加权平均法来计算灰度值,公式如下:

                       

Pillow 提供了多种图像模式,可以用于不同的转换和操作。常见的模式有:

  • '1': 1位像素,黑白图像,非零值为黑色。
  • 'L': 8位像素,灰度图像,灰度值范围从0到255。
  • 'RGB': 3x8位像素,真彩色图像,每个像素由红、绿、蓝三色组成。
  • 'RGBA': 4x8位像素,具有透明度通道的真彩色图像。
  • 'CMYK': 4x8位像素,颜色分量为青、洋红、黄、黑,常用于印刷。
  • 'HSV': 色调、饱和度、明度模式。
  • 'P': 8位像素,使用调色板映射到任何其他模式。

4:灰度翻转

通过计算 255 - gray_image 对每个像素值进行反转操作。

# 定义图片的路径
image_path = 'D:\\Torch\\Picture\\monkey_gray.png'

# 读取灰度图像
gray_image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)

# 进行灰度反转
inverted_image = 255 - gray_image
cv2.imwrite('D:\\Torch\\Picture\\monkey_gray_inverted.jpg', inverted_image)

5:图像的仿射变换

1.  线性变换

线性变换是仿射变换的一个组成部分,主要涉及对图像进行旋转、缩放、剪切等操作。在线性变换中,图像的各个点的坐标会通过一个矩阵乘法进行变换,从而改变图像的几何形状。

  • 旋转:将图像围绕某个点(通常是图像的中心)旋转一定的角度。旋转可以改变图像的方向。
  • 缩放:调整图像的大小。缩放操作可以使图像变大或变小。
  • 剪切:改变图像形状,使图像看起来像被倾斜的效果。

2.  平移

将图像在空间中的位置进行移动。通过平移,可以将图像整体向左、向右、向上或向下移动,而不会改变图像的形状或大小。

平移通过在点的坐标上加上一个常量值来实现。例如,如果要将图像向右移动10个像素,则可以将每个点的x坐标加上10。

3. cv2.getRotationMatrix2D

# 读取图像
image = cv2.imread('D:\\Torch\\Picture\\monkey.png')

# 获取图像的高度和宽度
(h, w) = image.shape[:2]

# 设置旋转中心为图像的中心
center = (w // 2, h // 2)

# 设置旋转角度(比如旋转45度)和缩放比例(1.0表示不缩放)
angle = 75  # 旋转角度,正值表示逆时针旋转,负值表示顺时针旋转
scale = 1  # 缩放比例,1.0 表示原始大小

# 生成旋转矩阵
# getRotationMatrix2D返回一个2x3的旋转矩阵
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)

# 进行仿射变换(旋转变换)
# warpAffine(image, M, dsize) 使用指定的旋转矩阵 M 进行仿射变换
rotated_image = cv2.warpAffine(image, rotation_matrix, (w, h))
print(f"{type(rotated_image)}")

# 保存旋转后的图像
cv2.imwrite('D:\\Torch\\Picture\\rotated_monkey.png', rotated_image)

cv2.getRotationMatrix2D(center, angle, scale) 函数相当于为你自动计算好了旋转矩阵的各个参数。它通过你提供的旋转角度、中心点和缩放比例,生成一个用于图像旋转和缩放的 2x3 仿射变换矩阵。

这个矩阵本质上是一个简化了的仿射变换矩阵,已经包含了旋转和缩放的计算,所以你不需要手动计算每个像素的新位置。你只需要将这个矩阵传递给 cv2.warpAffine 函数,它就会根据矩阵自动对图像进行旋转和缩放操作。


6:对数变换

取对数的目的是为了压缩高亮区域的灰度值,使得亮度跨度大的图像在视觉上更加均匀。通过对数变换,高亮部分的灰度值变化被压缩,而暗部区域的细节得到增强。

# 将像素值转换为浮点数类型
image_float = np.float32(image)

# 对数变换公式:s = c * log(1 + r)
c = 255 / np.log(1 + np.max(image_float))
log_image = c * (np.log(1 + image_float))

# 归一化到0-255范围
log_image = np.uint8(log_image)

你想一下log函数,是不是亮度越低加成越大,亮度越高加成越小!


7:伽马变换

调整图像的亮度,使其符合人眼。也可以作为一种数据增强手段,增加数据的多样性,提高模型泛化能力。

  • Gamma < 1:使图像变得更亮。
  • Gamma > 1:使图像变得更暗。

                                gamma=2                                                      gamma=0.5        


8:直方图均衡化-----cv2.equalizeHist

为了增加对比度,让图像看起来更清楚。右图为均衡化后的灰度图。

直方图均衡化的工作原理

  1. 计算直方图:统计每个灰度级的像素数量。
  2. 计算累计直方图:计算每个灰度级的累计分布(所占比例,还要把前几级的灰度值占比也加                              上)
  3. 映射灰度级:output=累计占比*图片中最亮灰度级


9:未完待续。。。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值