临沂建设局网站,视频推广渠道有哪些,wordpress 淘宝客app,wordpress可视化编辑器文章目录 数字图像增强亮度与对比度转换几何变换图像裁剪尺寸变换图像旋转 噪声处理添加噪声处理噪声 数字图像增强
亮度与对比度转换
图像变换可分为以下两种#xff1a;
点算子#xff1a;基于像素变换#xff0c;在这一类图像变换中#xff0c;仅仅根据输入像素值计算… 文章目录 数字图像增强亮度与对比度转换几何变换图像裁剪尺寸变换图像旋转 噪声处理添加噪声处理噪声 数字图像增强
亮度与对比度转换
图像变换可分为以下两种
点算子基于像素变换在这一类图像变换中仅仅根据输入像素值计算相应的输出像素值邻域算子基于图像区域进行变换
两种常用的点算子是用常数对点的像素值进行乘法或加法运算可以表示为 g ( i , j ) α ∗ f ( i , j ) β g(i, j) \alpha * f(i, j) \beta g(i,j)α∗f(i,j)β
其中图像中点的位置为 ( i , j ) (i, j) (i,j)α值代表增益β值代表偏置。对图像进行亮度和对比度的变换就是一种点算子这两个参数分别可以用来控制对比度与亮度。可以通过调节这两个参数的值来对图片进行对比度或亮度的调节。即将原图像中的每一个像素点都加上一个偏置常数则可以使图片的亮度变大。类似地将原图片中的像素点乘上一个增益系数可以调整图片的对比度。 注意 图片像素点的像素值取值范围是[0255]一定不要让其溢出可以使用np.clip进行截断 示例图像 import cv2
import numpy as np# 方法1 基于addWeighted()函数实现
def convert_img1(img, alpha, beta):blank np.zeros(img.shape, img.dtype)return cv2.addWeighted(img, alpha, blank, 0, beta)# 方法2 通过for循环手动实现
def convert_img2(img, alpha, beta):rows, cols, chs img.shapenew_img np.zeros(img.shape, img.dtype)for i in range(rows):for j in range(cols):for k in range(chs):new_img[i, j, k] np.clip(alpha * img[i, j, k] beta, 0, 255)return new_imgimg cv2.imread(woman.png)
cv2.imwrite(convert_img1.jpg, convert_img1(img, 2.2, 50))
cv2.imwrite(convert_img2.jpg, convert_img2(img, 2.2, 50))在上述代码中函数convert_img1()中的addWeighted()函数的参数列表分别为[img1,alpha,img2,beta,gamma]代表将两个图片进行如下计算 n e w _ i m g a l p h a ∗ i m g 1 b e t a ∗ i m g 2 g a m m a new\_img alpha * img1 beta * img2 gamma new_imgalpha∗img1beta∗img2gamma
而函数convert_img2()实现的过程就是通过for循环修改原始图片的像素值与函数convert_img1()的过程是一样的只不过convert_img1()函数调用addWeighted()函数的img2参数中图片的像素值都是0而已。
几何变换
图像的几何变换是指对图片中的图像像素点的位置进行变换的一种操作它将一幅图像中的坐标位置映射到新的坐标位置也就是改变像素点的空间位置同时也要估算新空间位置上的像素值。
图像裁剪
在图像数据的矩阵中裁剪出部分矩阵作为新的图像数据从而实现对图像的裁剪。
import cv2
import numpy as np# 图像裁剪
img cv2.imread(woman.png)
print(img.shape)new_img img[20:300, 20:400]
cv2.imwrite(crop_img.jpg, new_img)上述代码实现的过程是将原始的图像从第(2020)个像素点的位置裁剪到(300400)处裁剪的形状是矩形。
尺寸变换
修改图像的尺寸也就是修改图像的大小OpenCV的resize()函数可以实现这样的功能。对图像进行尺寸变换时必然会丢失或者增加一些像素点。在缩放时建议使用区域插值cv2.INTER_AREA可以避免出现波纹在放大时建议使用三次样条插值cv2.INTER_CUBIC但是其计算速度相对较慢。也可以使用线性插值cv2.INTER_LINEAR默认情况下所有改变图像尺寸大小的操作使用的插值法都是线性插值。
# 图像缩放
small_resize_img cv2.resize(img, (200, 200), interpolationcv2.INTER_AREA)
cv2.imwrite(small_resize.jpg, small_resize_img)small_resize_img2 cv2.resize(img, None, fx0.5, fy0.6, interpolationcv2.INTER_AREA) # 图像的宽对应的是列数高对应的是行数
cv2.imwrite(small_resize2.jpg, small_resize_img2)图像旋转
旋转通过getRotationMatrix2D()函数来实现。
# 图像旋转
img cv2.imread(woman.png)
rows, cols, _ img.shape
rotated_mat cv2.getRotationMatrix2D((cols/2, rows/2), 45, 1) # 第一个参数是旋转中心第2个为旋转角度第3个为旋转后的缩放因子
rotated_img cv2.warpAffine(img, rotated_mat, dsize(cols, rows))
cv2.imwrite(rot45.jpg, rotated_img)噪声处理
对训练数据添加适量噪声可以使训练后的模型更加鲁棒对模型的性能提升有一定帮助。对噪声进行消除可以增加图像的质量。
添加噪声
对图像添加两种常用噪声的方法
椒盐噪声高斯噪声
import cv2
import random
import numpy as np# 添加椒盐噪声
def salt_and_pepper_noise(img, percentage):rows, cols, chs img.shapenum int(percentage * rows * cols)for i in range(num):x random.randint(0, rows-1)y random.randint(0, cols-1)z random.randint(0, chs-1)if random.randint(0, 1) 0:img[x, y, z] 0 # 黑色噪点else:img[x, y, z] 255 # 白色噪点return img# 添加高斯随机噪声
def gaussian_noise(img, mu, sigma, delta):rows, cols, chs img.shapefor i in range(rows):for j in range(cols):for k in range(chs):# 生成高斯分布的随机数与原始数据相加要取整value int(img[i, j, k] delta*random.gauss(mumu, sigmasigma))value np.clip(a_max255, a_min0, avalue)img[i, j, k] valuereturn imgimg cv2.imread(woman.png)cv2.imwrite(saltPepper.jpg, salt_and_pepper_noise(img, 0.3))
cv2.imwrite(gaussain.jpg, gaussian_noise(img, 0, 1, 100))可以看到上述为图像添加椒盐噪声和高斯噪声的方法。对于高斯噪声来说函数gaussian_noise()中的mu参数代表了随机数高斯分布的平均值sigma代表随机数高斯分布的标准差而参数delta代表一个系数表明添加高斯噪声的强度。
处理噪声
OpenCV提供了几种滤波方法如中值滤波、双边滤波、高斯模糊、二维卷积等
import cv2
import random
import numpy as np# 模糊与滤波
salt_and_pepper_img cv2.imread(saltPepper.jpg)
gaussain_img cv2.imread(gaussain.jpg)# 二维卷积
kernel np.ones((5, 5), np.float32) / 25 # 每个值是0.04
conv_2d_img cv2.filter2D(salt_and_pepper_img, -1, kernel)
cv2.imwrite(filter_2d_img.jpg, conv_2d_img)# 中值滤波
median_blur_img cv2.medianBlur(salt_and_pepper_img, 5) # 参数5表示大小为5x5的区域像素值进行计算
cv2.imwrite(median_blur_img.jpg, median_blur_img)# 高斯模糊
gaussian_blur_img cv2.GaussianBlur(gaussain_img, (5, 5), 0)
cv2.imwrite(gaussian_blur_img.jpg, gaussian_blur_img)# 双边滤波
bilateral_filter_img cv2.bilateralFilter(gaussain_img, 9, 75, 75) # 9代表邻域直径两个参数75分别代表值域与空域标准差
cv2.imwrite(bilateral_filter_img.jpg, bilateral_filter_img)可以看到中值滤波的效果是最好的。