数字图像处理:亮度对比度-几何变换-噪声处理

文章目录

    • 数字图像增强
      • 亮度与对比度转换
      • 几何变换
        • 图像裁剪
        • 尺寸变换
        • 图像旋转
      • 噪声处理
        • 添加噪声
        • 处理噪声

数字图像增强

亮度与对比度转换

图像变换可分为以下两种:

  • 点算子:基于像素变换,在这一类图像变换中,仅仅根据输入像素值计算相应的输出像素值
  • 邻域算子:基于图像区域进行变换

两种常用的点算子是用常数对点的像素值进行乘法或加法运算,可以表示为:

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)α值代表增益,β值代表偏置。对图像进行亮度和对比度的变换就是一种点算子,这两个参数分别可以用来控制对比度与亮度。可以通过调节这两个参数的值,来对图片进行对比度或亮度的调节。即将原图像中的每一个像素点都加上一个偏置常数,则可以使图片的亮度变大。类似地,将原图片中的像素点乘上一个增益系数,可以调整图片的对比度。

注意

图片像素点的像素值取值范围是[0,255],一定不要让其溢出,可以使用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_img=alphaimg1+betaimg2+gamma

而函数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)

在这里插入图片描述

上述代码实现的过程是将原始的图像从第(20,20)个像素点的位置,裁剪到(300,400)处,裁剪的形状是矩形。

尺寸变换

修改图像的尺寸也就是修改图像的大小,OpenCV的resize()函数可以实现这样的功能。对图像进行尺寸变换时,必然会丢失或者增加一些像素点。在缩放时建议使用区域插值cv2.INTER_AREA,可以避免出现波纹;在放大时建议使用三次样条插值cv2.INTER_CUBIC,但是其计算速度相对较慢。也可以使用线性插值cv2.INTER_LINEAR,默认情况下所有改变图像尺寸大小的操作使用的插值法都是线性插值。

# 图像缩放
small_resize_img = cv2.resize(img, (200, 200), interpolation=cv2.INTER_AREA)
cv2.imwrite('small_resize.jpg', small_resize_img)small_resize_img2 = cv2.resize(img, None, fx=0.5, fy=0.6, interpolation=cv2.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(mu=mu, sigma=sigma))value = np.clip(a_max=255, a_min=0, a=value)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)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

可以看到,中值滤波的效果是最好的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/104002.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

47、TCP的流量控制

从这一节开始,我们学习通信双方应用进程建立TCP连接之后,数据传输过程中,TCP有哪些机制保证传输可靠性的。本节先学习第一种机制:流量控制。 窗口与流量控制 首先,我们要知道的是:什么是流量控制&#xff…

MR源码解析和join案例

MR源码解析 new Job(): 读取本地文件, xml配置job.start(): 启动线程job的run():线程方法 runTasks(): 传入对应的接口,启动map或者reduceMapTask类的run(): 设置map阶段的参数,初始化任务,创建上下文对象 创建读取器LineRecordReader判断是…

Windows下搭建MavLink通信协议环境,并用C++程序测试

搭建环境 git克隆 git clone https://github.com/mavlink/mavlink.git --recursive安装python的future库 pip install future使用可视化工具生成mavlink库 XML是选择消息格式,也可以自定义Out是输出路径Language是生成的语言,我这里是CProtocol是协议…

“五度晟企通”企业发展服务平台正式发布,帮扶企业行稳致远!

在数字中国建设的大背景下,“五度易链”以企业实际发展需求为牵引,以帮扶企业行稳致远为目标,基于全体量产业大数据,运用NLP、AI等新一代信息技术,打造了数字化ToB企业发展服务平台“五度晟企通”,旨在以数…

企微SCRM营销平台MarketGo-ChatGPT助力私域运营

一、前言 ChatGPT是由OpenAI(开放人工智能)研发的自然语言处理模型,其全称为"Conversational Generative Pre-trained Transformer",即对话式预训练转换器。它是GPT系列模型的最新版本,GPT全称为"Gene…

16-数据结构-图的存储结构

简介:主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码,邻接矩阵又分为有权图和无权图,区别就是有数据的地方填权值,无数据的地方可以填0或者∞,而有权图和无权图,又细分为有向图和无向…

【腾讯云Cloud Studio实战训练营】戏说cloud studio

文章目录 前言产品概述项目体验登录空间模板模板项目体验 总结 前言 在奇幻世界中,存在着一片神秘的云海,被人们称为腾讯云云端开发环境 Cloud Studio。这片云海是一座巨大的浮岛,上面漂浮着一个集成式开发环境(Integrated Devel…

CUDA和cudnn详细安装过程【通用win】

1 软硬件资源 仅作参考,其他型号通用 win 11 32内存显卡 RTX 2080Ti ,驱动版本号:516.59python 3.8.10torch 1.8.0 框架cudatoolkit 11.1cudnn 8.0.4 2 查看适用cuda版本 2.1 查看本机的cuda算力 安装之前先进入官网查看自己的显卡能不能用…

Android 在TextView前面添加多个任意View且不影响换行

实现效果如下: 如上,将头像后面的东西看作一个整体,因为不能影响后面内容的换行,且前面控件的长度是可变的,所以采用自定义View的方法来实现: /*** CSDN深海呐 https://blog.csdn.net/qq_40945489/articl…

leetcode386. 字典序排数(java)

字典序排数 题目描述递归法迭代 题目描述 难度 - 中等 leetcode386. 字典序排数 给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1: 输入:n 13 输出&#xff1a…

手机也可以搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站【cpolar实现公网访问】

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

基于Java+SpringBoot+Vue前后端分离农产品直卖平台设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…