计算机视觉 | 八斗人工智能 (上)

数字图像

像素和分辨率

像素
像素是分辨率的单位。像素是构成位图图像最基本的单元。

分辨率
图像分辨率 就是 单位英寸内的像素点数(PPI)
屏幕尺寸 指的是 对角线的长度
像素点数量:1920*1080
分辨率是指:PPI
两者不可混淆

灰度、通道和对比度

灰度
表示图像像素的明暗程度的数值,也就是黑白图像中点的颜色深度。白色为255,黑色为0

通道
在这里插入图片描述
对比度
指不同颜色之间的差别。 对比度=最大灰度值/最小灰度值

三原色
在这里插入图片描述
计算机中,数字计算机是光学三原色(RGB),美术上用的是色彩三原色(CMYK)

RGB转化为Gray
在这里插入图片描述
cv2中封装的函数: cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
很多图像识别将RGB图像灰度化。

RGB值(初始为[0,255]之间的整数值)转化为浮点数:
在这里插入图片描述

其他概念

频率:灰度值变化剧烈程度的指标
幅值:一个周期内交流电出现的瞬时最大值
数字图像: 计算机保存的图像都是一个一个的像素点,称为数字图像
取值: 要用多少点来描述一幅图像
量化:要使用多大范围的数值来表示图像采样之后的一个点

插值算法

上采样和下采样的概念

上采样:主要功能是放大原图像,可以显示在更高分辨率的显示设备上
原理:内插值

下采样:主要目的是:生成对应图像的缩略图
原理:插值 or (M/s)*(N/s)

1. 最邻近插值

cv2.resize函数的实现原理是图像插值,也称为图像重采样。它的目的是在图像的缩放、旋转、平移等变换中,将像素从原始位置移动到新位置,并生成新的像素值。在cv2.resize函数中,可以使用不同的插值方法,如最邻近插值、双线性插值、双三次插值等。其中,最邻近插值是一种简单的插值方法

它的原理如下:

首先确定目标图像上的一个像素位置,假设这个位置为(x, y);
计算出原始图像上的对应位置,假设为(x’, y’);
最邻近插值方法将原始图像上离(x’, y’)最近的像素的值赋给目标图像上的(x, y)位置。
也就是说,最邻近插值方法并不考虑离目标位置较远的像素,而是选择距离最近的像素来进行插值,因此它的计算速度非常快。但是,由于它没有考虑周围像素的权重,因此可能会产生锯齿状的边缘或明显的马赛克效应,特别是在图像缩放比例较大时。
除了最邻近插值方法之外,cv2.resize函数还支持双线性插值和双三次插值等更高级的插值方法。在实际应用中,我们需要根据具体的应用场景来选择合适的插值方法。

代码:

import cv2

def nearest_upsampling(img, scale):
    """
    实现RGB图像最邻近插值的上采样功能
    :param img: 原始图像,必须为RGB图像
    :param scale: 上采样比例
    :return: 上采样后的图像
    """
    # 获取原始图像的宽和高
    height, width, channels = img.shape

    # 计算上采样后的宽和高
    new_width = int(width * scale)
    new_height = int(height * scale)

    # 使用cv2.resize实现最邻近插值的上采样
    img_upsampled = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_NEAREST)

    return img_upsampled

使用方式:

# 读取图像
img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)

# 进行最邻近插值的上采样,比例为2
img_upsampled = nearest_upsampling(img, 2)

# 显示原始图像和上采样后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Upsampled Image', img_upsampled)
cv2.waitKey(0)
cv2.destroyAllWindows()

2.双线性插值(最常用)

双线性插值是一种图像插值方法,它可以用于图像的缩放、旋转、平移等变换中。通俗来讲,就是在缩放或旋转图像时,使用周围4个像素的颜色信息来计算新像素的颜色值,以达到图像的平滑处理。双线性插值的原理就是先在水平方向上进行一次线性插值,然后在垂直方向上进行一次线性插值,将这两次插值的结果进行加权平均,得到最终的插值结果。这种方法比最邻近插值更平滑,而比双三次插值计算速度更快,因此在许多图像处理的应用场景中被广泛使用

代码:

import cv2

def bilinear_interpolation(img, scale):
    """
    实现双线性插值的上采样功能
    :param img: 原始图像
    :param scale: 上采样比例
    :return: 上采样后的图像
    """
    # 获取原始图像的宽和高
    height, width = img.shape[:2]

    # 计算上采样后的宽和高
    new_width = int(width * scale)
    new_height = int(height * scale)

    # 使用cv2.resize实现双线性插值的上采样
    img_upsampled = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_LINEAR)

    return img_upsampled

使用方法

# 读取图像
# cv2.IMREAD_COLOR是cv2.imread函数的一个参数,它的作用是告诉OpenCV以彩色图像的方式读取图像。
img = cv2.imread('test.jpg', cv2.IMREAD_COLOR)

# 进行双线性插值的上采样,比例为2
img_upsampled = bilinear_interpolation(img, 2)

# 显示原始图像和上采样后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Upsampled Image', img_upsampled)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.双三次插值

双三次插值是一种高级的图像插值方法,它可以用于图像的缩放、旋转、平移等变换中。与双线性插值相比,双三次插值可以更加准确地保留原始图像的细节信息,从而在图像处理的应用场景中得到广泛应用。

双三次插值的原理

双三次插值的原理是在水平方向和垂直方向都进行三次插值,使用周围16个像素的颜色信息来计算新像素的颜色值。在三次插值的过程中,首先计算出相邻的四个像素的插值函数,然后再将这四个插值函数组合成一个整体的插值函数。这个整体插值函数的求解需要用到矩阵运算,因此计算复杂度较高,但是它可以在保持图像平滑的同时,尽可能地保留原始图像的细节信息。

代码实现:

import cv2

def upscale_image_bicubic(img, scale_factor):
    """
    使用双三次插值提高图像分辨率
    :param img: 原始图像
    :param scale_factor: 提高分辨率的倍数
    :return: 分辨率提高后的图像
    """
    # 获取原始图像的宽和高
    height, width = img.shape[:2]

    # 计算分辨率提高后的宽和高
    new_width = int(width * scale_factor)
    new_height = int(height * scale_factor)

    # 使用cv2.resize函数进行分辨率提高,采用双三次插值方式
    upscaled_img = cv2.resize(img, (new_width, new_height), interpolation=cv2.INTER_CUBIC)

    return upscaled_img

使用方法如以上其他函数相同

直方图均衡化

图像的灰度直方图就是描述了图像灰度分布规律,它描述每个灰度级具有的像素个数
图像的灰度直方图不关系像素所处的空间位置,因此不受图像旋转和平移变化 的影响,可以作为图像的特征。
在这里插入图片描述
代码实现:

import cv2
import matplotlib.pyplot as plt

def plot_gray_histogram(img):
    """
    绘制灰度图像直方图
    :param img: 灰度图像
    :return: None
    """
    # 计算灰度图像的直方图
    hist = cv2.calcHist([img], [0], None, [256], [0, 256])

    # 绘制直方图
    plt.plot(hist)

    # 设置x轴和y轴的标签和标题
    plt.xlim([0, 256])
    plt.xlabel('灰度值')
    plt.ylabel('像素数量')
    plt.title('灰度图像直方图')

    # 显示直方图
    plt.show()

import cv2

# 读取灰度图像   cv2.IMREAD_GRAYSCALE以灰度图读取
img = cv2.imread('tem.jpg', cv2.IMREAD_GRAYSCALE)

# 绘制灰度图像直方图
plot_gray_histogram(img)

直方图均衡化是将原图像的直方图通过变换函数变为均匀分布的直方图,然后按照均匀直方图修改原图像,从而获得一幅会的分布均匀的新图像,直方图均衡化就是用一定的算法使直方图大致平和的方法
其主要功能是 图像增强
在这里插入图片描述

1. 灰度图直方图均衡化

import cv2

def equalize_gray_hist(img):
    """
    灰度图直方图均衡化
    :param img: 灰度图像
    :return: 均衡化后的灰度图像
    """
    # 进行直方图均衡化
    equalized_img = cv2.equalizeHist(img)

    return equalized_img

2. 彩色图直方图均衡化

YUV格式:

在彩色图直方图均衡化中,我们只对Y通道进行直方图均衡化,而U和V通道保持不变。这是因为在YUV颜色空间中,Y通道代表亮度,而U和V通道代表色度,均衡化亮度通道能够增强图像对比度而不改变色度信息。

import cv2
import numpy as np

def equalize_color_hist(img):
    """
    彩色图直方图均衡化
    :param img: 彩色图像
    :return: 均衡化后的彩色图像
    """
    # 将图像转换为YUV格式
    yuv_img = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)

    # 对Y通道(亮度)进行直方图均衡化
    yuv_img[:,:,0] = cv2.equalizeHist(yuv_img[:,:,0])

    # 将图像转换回BGR格式
    equalized_img = cv2.cvtColor(yuv_img, cv2.COLOR_YUV2BGR)

    return equalized_img

猜你喜欢

转载自blog.csdn.net/lijiamingccc/article/details/130224456