大家好,欢迎来到IT知识分享网。
图像处理算法之——常用传统图像增强算法代码实现
前言
现阶段图像增强技术用的越来越多,尤其在目标检测和图像分割等领域。我上篇博文介绍了一种比较好涨点的、新的图像数据增强算法:YOCO (You Only Cut Once)数据增强。这里就简单介绍几种常用的传统图像增强算法,并附上代码。
一、椒盐噪声和高斯噪声
1.1、椒盐噪声
椒盐噪声(Pepper and Salt noise),也被称作脉冲噪声,是一种在图像中常见的噪声形式。它随机地将图像中的一些像素点的值变为最大值(通常在灰度图像中为255,代表“盐”)或最小值(通常为0,代表“胡椒”),从而产生一种黑白杂点的视觉效果。代码如下:
import cv2 import random def PepperandSalt(src,percetage): NoiseImg = src.copy() # 使用 copy 来避免改变原始图像 NoiseNum=int(percetage*src.shape[0]*src.shape[1]) for i in range(NoiseNum): randX=random.random_integers(0,src.shape[0]-1) randY=random.random_integers(0,src.shape[1]-1) if random.random_integers(0,1)<=0.5: NoiseImg[randX,randY]=0 else: NoiseImg[randX,randY]=255 return NoiseImg img=cv2.imread(r'zfg.jpg') img1=PepperandSalt(img,0.02) cv2.imwrite(r'zfg1.jpg',img1) cv2.imshow('PepperandSalt',img1) cv2.waitKey(0)
1.1、高斯噪声
import cv2 import random def GaussianNoise(src, means, sigma): NoiseImg = src.copy() # 使用 copy 来避免改变原始图像 rows, cols = NoiseImg.shape[:2] # 为整个图像生成高斯噪声 gauss = np.random.normal(means, sigma, (rows, cols)).reshape(rows, cols) # 添加噪声并确保结果仍然在有效范围内 NoiseImg = NoiseImg + gauss[..., np.newaxis] if len(src.shape) == 3 else NoiseImg + gauss np.clip(NoiseImg, 0, 255, out=NoiseImg) # 限制值在0到255之间 NoiseImg = NoiseImg.astype(np.uint8) # 转换为无符号8位整型 return NoiseImg img=cv2.imread(r'zfg.jpg') img1=GaussianNoise(img,0,10) cv2.imwrite(r'zfg2.jpg',img1) cv2.imshow('GaussianNoise',img1) cv2.waitKey(0)
效果如下(小小的出卖下自己哈哈🤣)
二、改变亮度
这里先直接上代码吧
import cv2 import numpy as np alpha = 0.3 beta = 80 img_path = r'zfg.jpg' img = cv2.imread(img_path) img2 = cv2.imread(img_path) def updateAlpha(x): global alpha, img, img2 alpha = cv2.getTrackbarPos('Alpha', 'image') alpha = alpha * 0.01 img = np.uint8(np.clip((alpha * img2 + beta), 0, 255)) def updateBeta(x): global beta, img, img2 beta = cv2.getTrackbarPos('Beta', 'image') img = np.uint8(np.clip((alpha * img2 + beta), 0, 255)) # 创建窗口 cv2.namedWindow('image') cv2.createTrackbar('Alpha', 'image', 0, 300, updateAlpha) cv2.createTrackbar('Beta', 'image', 0, 255, updateBeta) cv2.setTrackbarPos('Alpha', 'image', 100) cv2.setTrackbarPos('Beta', 'image', 10) while (True): cv2.imshow('image', img) if cv2.waitKey(1) == ord('q'): break cv2.destroyAllWindows()
运行后效果如下所示:
图片的上面设置了两个可调节的功能,一个是Alpha;一个是Beta,其主要功能如下:
1、alpha(Alpha)是增益或对比度系数。如果 alpha 大于1,对比度会增加,小于1(但大于0)时,对比度会减少。alpha 等于1意味着对比度不变。
2、beta(Beta)是偏置量,用于控制亮度。通过增加或减少 beta 值,可以使图像变亮或变暗。正值会使图像亮度增加,负值会使其减少。
在代码中:
1、updateAlpha 函数用于更新图像的对比度。当用户移动Alpha轨迹条时,会调用 updateAlpha 函数,并更新 alpha 值,进而更新图像。cv2.getTrackbarPos(‘Alpha’, ‘image’) 获得轨迹条的当前位置,乘以0.01是因为轨迹条的范围是0到300(为了精细调整对比度),而实际 alpha 应该在0到3之间。
2、updateBeta 函数用于更新图像的亮度。当用户移动Beta轨迹条时,会调用 updateBeta 函数,并更新 beta 值,进而更新图像。轨迹条的范围是0到255,直接映射到 beta 值。
在这两个函数中,通过 np.clip((alpha * img2 + beta), 0, 255) 确保更新后图像的像素值仍然在0到255的有效范围内。np.uint8 确保像素值类型正确(无符号8位整数)。
代码的最后部分创建了一个窗口,并在无限循环中显示调整后的图像,直到用户按下’q’键为止。轨迹条的位置改变时会实时更新显示的图像亮度和对比度。
这里就先介绍两种吧,下次继续更新~
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/126393.html