图像增样
翻转
import cv2
img = cv2.imread("./images/cat.jpg")
# 0轴:X轴(垂直翻转)
# 1轴:Y轴(水平翻转)
# -1:XY轴(水平垂直翻转)
img1 = cv2.flip(img,0)
img2 = cv2.flip(img,1)
img3 = cv2.flip(img,-1)
img = cv2.hconcat([img1,img2,img3])
cv2.imshow("cat",img)
cv2.waitKey(0)
旋转
旋转有两种方法
- 自适应设置旋转角度--更加灵活
import cv2
import numpy as np
# 读取图像
image = cv2.imread('1.jpg')
# 定义旋转角度(逆时针为正方向)
angle = 45 # 旋转角度为45度,可以根据需要修改
# 获取图像中心点坐标
height, width = image.shape[:2]
center = (width // 2, height // 2)
# 计算旋转矩阵
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale=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()
- 固定参数选择
函数说明:
cv2.rotate( src, rotateCode[, dst] ) → M
参数说明: src:变换操作的输入图像 rotateCode:枚举,指定旋转角度。 cv2.ROTATE_90_CLOCKWISE:顺时针旋转 90 度 cv2.ROTATE_180: 旋转 180 度 cv2.ROTATE_90_COUNTERCLOCKWISE:逆时针旋转 90 度 返回值:dst,变换操作的输出图像,ndarray 多维数组
img = cv2.imread("./images/cat.jpg")
img1 = cv2.rotate(img, cv2.ROTATE_90_COUNTERCLOCKWISE)
cv2.imshow("cat",img1)
cv2.imshow("cat_original",img)
cv2.waitKey(0)
缩放
缩放常用三种方法:
- 普通缩放: 普通缩放是最简单直接的方式,通过直接缩放图像的像素值来改变图像的大小。这种方法计算速度快,适用于一般的图像缩放需求。然而,由于没有考虑像素之间的关系,可能导致缩放后图像的质量下降。
- 最近邻插值: 最近邻插值是一种简单的插值方法,它通过选择最接近目标位置的原始像素值来计算新像素的值。这种方法计算速度较快,适用于实时性要求较高的应用,但可能导致图像出现锯齿状的伪影,特别是在放大图像时。
- 双线性插值: 双线性插值是一种更复杂的插值方法,它考虑了周围四个像素的加权平均,以计算新像素的值。这种方法相对计算较慢,但通常能够产生较为平滑的缩放效果,特别适用于图像放大的情况。它在保持图像细节的同时减轻了最近邻插值可能引起的伪影问题。
import cv2
# 图片路径
image_path = './images/cat.jpg'
# 读取图像
img = cv2.imread(image_path)
# 指定缩放比例,这里设置为0.5表示缩放为原来的一半
scale_percent = 50
# 计算缩放后的新尺寸
width = int(img.shape[1] * scale_percent / 100)
height = int(img.shape[0] * scale_percent / 100)
# 普通缩放
resized_img = cv2.resize(img, (width, height))
# 最近邻插值
resized_img_nn = cv2.resize(img, (width, height), interpolation=cv2.INTER_NEAREST)
# 双线性插值
resized_img_bilinear = cv2.resize(img, (width, height), interpolation=cv2.INTER_LINEAR)
# 显示原始图像
cv2.imshow('Original Image', img)
# 显示普通缩放后的图像
cv2.imshow('Resized Image', resized_img)
# 显示最近邻插值后的图像
cv2.imshow('Resized Image (Nearest-neighbor)', resized_img_nn)
# 显示双线性插值后的图像
cv2.imshow('Resized Image (Bilinear)', resized_img_bilinear)
# 等待按键结束
cv2.waitKey(0)
cv2.destroyAllWindows()
平移
平移是指沿着图像的水平或垂直方向移动图像的像素。这种操作通常用于图像配准和校正。
调整亮度
调整亮度是通过增加或减少图像的像素值来改变图像的明亮度。增加像素值会使图像变得更亮,减少像素值会使图像变暗。
对比度调整
调整对比度是通过增加或减少图像中像素值的差异来改变图像的对比度。增加对比度会增强图像中的色彩和细节。
添加噪声
添加噪声是指向图像中引入随机干扰,以模拟真实世界中的噪声。常见的噪声类型包括高斯噪声、椒盐噪声等。
裁剪
裁剪是指从图像中剪切出感兴趣的区域,去除不需要的部分。这种操作通常用于调整图像的尺寸和去除不必要的背景。
色彩变换
色彩变换是通过改变图像的色彩空间或调整图像的色调、饱和度和亮度来改变图像的外观。
随机变换
随机变换是指对图像进行随机的变换操作,如随机旋转、随机缩放、随机翻转等,用于增加数据的多样性和鲁棒性
import cv2
import numpy as np
# 图片路径
image_path = './images/cat.jpg'
# 读取图像
img = cv2.imread(image_path)
# 平移
def translate(image, tx, ty):
translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]])
translated_image = cv2.warpAffine(image, translation_matrix, (image.shape[1], image.shape[0]))
return translated_image
# 调整亮度
def adjust_brightness(image, factor):
adjusted_image = cv2.convertScaleAbs(image, alpha=factor, beta=0)
return adjusted_image
# 调整对比度
def adjust_contrast(image, factor):
adjusted_image = cv2.convertScaleAbs(image, alpha=factor, beta=128 * (1 - factor))
return adjusted_image
# 添加噪声
def add_noise(image, mean=0, sigma=25):
noise = np.random.normal(mean, sigma, image.shape).astype('uint8')
noisy_image = cv2.add(image, noise)
return noisy_image
# 裁剪
def crop(image, x, y, w, h):
cropped_image = image[y:y+h, x:x+w]
return cropped_image
# 色彩变换
def color_transform(image, channel_transforms):
transformed_image = image.copy()
for channel, transform in enumerate(channel_transforms):
transformed_image[:, :, channel] = np.clip(transformed_image[:, :, channel] + transform, 0, 255)
return transformed_image
# 随机变换
def random_transform(image):
# 随机平移
tx = np.random.randint(-20, 20)
ty = np.random.randint(-20, 20)
translated_image = translate(image, tx, ty)
# 随机调整亮度
brightness_factor = np.random.uniform(0.5, 1.5)
brightened_image = adjust_brightness(translated_image, brightness_factor)
# 随机调整对比度
contrast_factor = np.random.uniform(0.5, 1.5)
contrasted_image = adjust_contrast(brightened_image, contrast_factor)
# 随机添加噪声
noisy_image = add_noise(contrasted_image)
# 随机裁剪
x = np.random.randint(0, 50)
y = np.random.randint(0, 50)
w = np.random.randint(200, 300)
h = np.random.randint(200, 300)
cropped_image = crop(noisy_image, x, y, w, h)
# 随机色彩变换
channel_transforms = np.random.randint(-30, 30, size=(3,))
color_transformed_image = color_transform(cropped_image, channel_transforms)
return color_transformed_image
# 显示原始图像
cv2.imshow('Original Image', img)
# 显示变换后的图像
transformed_img = random_transform(img)
cv2.imshow('Transformed Image', transformed_img)
# 等待按键结束
cv2.waitKey(0)
cv2.destroyAllWindows()
图像上的运算
加减法
import cv2
import numpy as np
x = np.uint8([220])
y = np.uint8([25])
print(cv2.add(x,y))
print(cv2.subtract(x,y))
图像融合
图像融合也是加法的一种。因为两幅图像权重不同,可能会给人一种混合或者透明的感觉。
图像融合计算式:
g (x) = (1 − α) f0 (x) + α f1 (x)
通过修改
α
的值(
0
→
1
),可以实现非常酷的混合。
现在我们把两幅图混合在一起。第一幅图的权重是
0.7
,第二幅图的权重是
0.3
。函数
cv2.addWeighted()
可以按下面的公式对图片进行混合操作。
dst = α · img1 + β · img2 + γ
这里
γ
的取值为
0
。
import cv2
img1 = cv2.imread('1.jpg')
img2 = cv2.imread('9.jpg')
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
按位运算
按位操作有:AND,OR,NOT,XOR等。
-
AND 操作:
- 用途: 将两个图像进行按位与操作,保留两者共同部分。
- 文本表示:
result = cv2.bitwise_and(img1, img2)
-
OR 操作:
- 用途: 将两个图像进行按位或操作,保留两者至少有一个部分。
- 文本表示:
result = cv2.bitwise_or(img1, img2)
-
NOT 操作:
- 用途: 对图像进行按位非操作,将图像中的每个像素取反。
- 文本表示:
result = cv2.bitwise_not(img)
-
XOR 操作:
- 用途: 将两个图像进行按位异或操作,保留两者不同的部分。
- 文本表示:
result = cv2.bitwise_xor(img1, img2)
import cv2
img1 = cv2.imread('1.jpg')
img2 = cv2.imread('9.jpg')
rows, cols, channels = img2.shape
roi = img1[0:rows, 0:cols]
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
# cv2.imshow("mask_inv",mask_inv)
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
# cv2.imshow("img1_bg",img1_bg)
img2_fg = cv2.bitwise_and(img2, img2, mask=mask)
# cv2.imshow("img2_fg",img2_fg)
dst = cv2.add(img1_bg, img2_fg)
img1[0:rows, 0:cols] = dst
cv2.imshow('res', img1)
cv2.waitKey(0)