import cv2 import numpy as np import albumentations as A #图像处理类 class Image_enhancement: def __init__(self,): pass """===============================1.几何处理:==================================""" # 1.1 图片旋转(可选择旋转角度) def roate(self, frame=None,angle=30): h, w = frame.shape[:2] M = cv2.getRotationMatrix2D((w / 2, h / 2), angle, 1) img_roate = cv2.warpAffine(frame, M, (w, h)) return img_roate # 1.2 图片缩放(可选择缩放大小) def resize(self, frame=None,w=224,h=224): img_resized = cv2.resize(frame, (w, h)) # w,h return img_resized """===============================2.颜色空间变化:==================================""" # 2.1 图片的对比度、饱和度、亮度、色调变化 def ColorJitter(self, frame=None,brightness=0,hue=0,saturation=0,contrast=0): transform = A.ColorJitter(brightness=float(brightness),hue=float(hue),saturation=float(saturation),contrast=float(contrast),p=1) img_result = transform(image=np.array(frame)) img_color = img_result['image'] return img_color # 2.2 灰度图转换 def ToGray(self, frame=None ): # cvtColor的第一个参数是处理的图像,第二个是RGB2GRAY gray_img = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) return gray_img # 2.3 直方图均衡化 def equalhist(self, frame=None): # 直方图均衡化增强对比度:通过调整图像的灰度分布,增加图像的对比度,从而使图像更加清晰。 frame_lab = cv2.cvtColor(frame, cv2.COLOR_BGR2LAB) frame_lab[:, :, 0] = cv2.equalizeHist(frame_lab[:, :, 0]) enhanced_frame = cv2.cvtColor(frame_lab, cv2.COLOR_LAB2BGR) return enhanced_frame """===============================3.频率像素点操作:==================================""" # 3.1 模糊 # 3.1.1 高斯滤波 def Gaussblur(self, frame=None,count=3): transform = A.GaussianBlur(blur_limit=count, p=1) img_result = transform(image=np.array(frame))['image'] return img_result # 3.1.3 随机模糊 def Blur(self, frame=None, count=3): transform = A.Blur(blur_limit=count, p=1) img_result = transform(image=np.array(frame))['image'] return img_result # 3.1.2 中值滤波 def Medianblur(self, frame=None, count=3): transform = A.MedianBlur(blur_limit=count, p=1) img_result = transform(image=np.array(frame))['image'] return img_result # 3.2 锐化 # 3.2.1 使用sobel算子进行锐化 def sobel(self, frame=None): img_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) kernelx1 = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]], dtype=int) kernely1 = np.array([[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]], dtype=int) x1 = cv2.filter2D(img_gray, cv2.CV_16S, kernelx1) y1 = cv2.filter2D(img_gray, cv2.CV_16S, kernely1) absX1 = cv2.convertScaleAbs(x1) absY1 = cv2.convertScaleAbs(y1) img_result = cv2.addWeighted(absX1, 0.5, absY1, 0.5, 0) return img_result # 3.2.2 使用Prewitt算子进行锐化 def Prewitt(self, frame=None): img_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) kernelx1 = np.array([[-1, 0, 1], [-1, 0, 1], [-1, 0, 1]], dtype=int) kernely1 = np.array([[-1, -1, 1], [0, 0, 0], [1, 1, 1]], dtype=int) x1 = cv2.filter2D(img_gray, cv2.CV_16S, kernelx1) y1 = cv2.filter2D(img_gray, cv2.CV_16S, kernely1) absX1 = cv2.convertScaleAbs(x1) absY1 = cv2.convertScaleAbs(y1) img_result = cv2.addWeighted(absX1, 0.5, absY1, 0.5, 0) return img_result # 3.2.3 使用robert算子进行锐化 def robert(self, frame=None): img_gray = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY) kernelx1 = np.array([[-1, 0], [0, 1]], dtype=int) kernely1 = np.array([[0, -1], [1, 0]], dtype=int) x1 = cv2.filter2D(img_gray, cv2.CV_16S, kernelx1) y1 = cv2.filter2D(img_gray, cv2.CV_16S, kernely1) absX1 = cv2.convertScaleAbs(x1) absY1 = cv2.convertScaleAbs(y1) img_result = cv2.addWeighted(absX1, 0.5, absY1, 0.5, 0) return img_result # 3.3 添加噪声 # 3.3.1 添加高斯噪声 def add_gaussian_noise(self, frame=None, mean=0,sigma=30): # 生成高斯噪声矩阵 row, col, ch = frame.shape gaussian = np.random.randn(row, col, ch) * sigma + mean gaussian = gaussian.reshape(row, col, ch) img_result = frame + gaussian # 转换数据类型为8位无符号整数类型 img_result = cv2.convertScaleAbs(img_result) return img_result # 3.3.2 添加椒盐噪声 def add_salt_and_pepper_noise(self, frame=None, percentage=0): # percentage [0,100] # 确保百分比在 0 到 100 之间 if percentage < 0 or percentage > 100: percentage=0 # 生成椒盐噪声矩阵 row, col, ch = frame.shape noise = np.zeros((row, col, ch), np.uint8) for i in range(row): for j in range(col): rand = np.random.randint(0, 100) if rand < percentage: noise[i][j] = [0, 0, 0] elif rand > 100 - percentage: noise[i][j] = [255, 255, 255] else: noise[i][j] = frame[i][j] # 将椒盐噪声矩阵添加到原始图像中 img_result = cv2.add(frame, noise) return img_result # 3.3.3 添加均值噪声 def add_mean_noise(self, frame=None, mean=0,std_dev=30): # 生成均值噪声矩阵 row, col, ch = frame.shape noise = np.random.normal(mean, std_dev, (row, col, ch)).astype(np.uint8) # 将均值噪声矩阵添加到原始图像中 img_result = cv2.add(frame, noise) return img_result # 3.4 边缘检测 def Canny(self, frame=None): # 转为灰度图 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 高斯滤波 gray = cv2.GaussianBlur(gray, (5, 5), 0) # 边缘检测 canny_edged = cv2.Canny(gray, 30, 250) return canny_edged if __name__ == "__main__": # 类实例化 img_enhance = Image_enhancement() img_path = r'images/car_test.jpg' img = cv2.imread(img_path) # 测试1.1 图片旋转(可选择旋转角度) img_roate = img_enhance.roate(img,45) cv2.imwrite("out_imgs/out_1.jpg",img_roate) # 测试1.2 图片缩放(可选择缩放大小) img_resized = img_enhance.resize(img, w=224, h=224) cv2.imwrite("out_imgs/out_2.jpg", img_resized) # 测试2.1 图片的对比度、饱和度、亮度、色调变化 img_resized = img_enhance.ColorJitter(img, brightness=10,hue=10,saturation=10,contrast=10) cv2.imwrite("out_imgs/out_3.jpg", img_resized) # 测试2.2 灰度图转化 gray_img = img_enhance.ToGray(img) cv2.imwrite("out_imgs/out_4.jpg", gray_img) # 测试2.3 直方图均衡化 enhanced_frame = img_enhance.equalhist(img) cv2.imwrite("out_imgs/out_5.jpg", enhanced_frame) # 3.1 模糊 # 3.1.1 高斯滤波 img_gauss = img_enhance.Gaussblur(img,count=5) cv2.imwrite("out_imgs/out_6.jpg", img_gauss) # 3.1.2 随机模糊 img_Blur = img_enhance.Blur(img, count=5) cv2.imwrite("out_imgs/out_7.jpg", img_Blur) # 3.1.3 中值滤波 img_Medianblur = img_enhance.Medianblur(img, count=5) cv2.imwrite("out_imgs/out_8.jpg", img_Medianblur) # 3.2 锐化 # 3.2.1 使用sobel算子进行锐化 img_sobel = img_enhance.sobel(img) cv2.imwrite("out_imgs/out_9.jpg", img_sobel) # 3.2.2 使用Prewitt算子进行锐化 img_Prewitt = img_enhance.Prewitt(img) cv2.imwrite("out_imgs/out_10.jpg", img_Prewitt) # 3.2.3 使用robert算子进行锐化 img_robert = img_enhance.robert(img) cv2.imwrite("out_imgs/out_11.jpg", img_robert) # 3.3 添加噪声 # 3.3.1 添加高斯噪声 img_gaussian_noise = img_enhance.add_gaussian_noise(img,mean=0,sigma=30) cv2.imwrite("out_imgs/out_12.jpg", img_gaussian_noise) # 3.3.2 添加椒盐噪声 img_salt_and_pepper_noise = img_enhance.add_salt_and_pepper_noise(img, percentage=10) cv2.imwrite("out_imgs/out_13.jpg", img_salt_and_pepper_noise) # 3.3.3 添加均值噪声 img_mean_noise = img_enhance.add_mean_noise(img, mean=0, std_dev=30) cv2.imwrite("out_imgs/out_14.jpg", img_mean_noise) # 3.4 边缘检测 img_Canny = img_enhance.Canny(img) cv2.imwrite("out_imgs/out_15.jpg", img_Canny)