目录
- 数字图像
- 像素和分辨率
- 灰度、通道和对比度
- 其他概念
- 插值算法
- 上采样和下采样的概念
- 1. 最邻近插值
- 2.双线性插值(最常用)
- 3.双三次插值
- 直方图均衡化
- 1. 灰度图直方图均衡化
- 2. 彩色图直方图均衡化
数字图像
像素和分辨率
像素
:
像素是分辨率的单位。像素是构成位图图像最基本的单元。
分辨率
:
图像分辨率 就是 单位英寸内的像素点数(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