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

news2024/10/8 11:35:57

文章目录

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

数字图像增强

亮度与对比度转换

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

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

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

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.shape
    new_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_img

img = 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.shape
    num = 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.shape
    for 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] = value
    return img


img = 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.coloradmin.cn/o/977980.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

真随机数生成器TRNG外设模块详解

真随机数生成器TRNG外设模块详解 文章目录 真随机数生成器TRNG外设模块详解简介原理与机制应用要点时钟源中断源初始化数据 软件支持 简介 国产车规微控制器原厂云途半导体设计和发售的YTM32ME微控制器上集成的真随机数生成器TRNG(True Random Number Generator&am…

01_TMS320F28004x系列MCU介绍和资料搜集

1. TI C2000 实时微控制器 TI公司在处理器方面的产品线有:基于ARM内核的微控制器/微处理器、MSP430微控制器、C2000系列实时微控制器、还有数字信号处理器(DSP)。 其中,C2000是TI公司专门针对实时控制推出的32位微控制器。TI公司…

继承(个人学习笔记黑马学习)

1、基本语法 #include <iostream> using namespace std; #include <string>//普通实现页面//Java页面 //class Java { //public: // void header() { // cout << "首页、公开课、登录、注册...(公共头部)" << endl; // } // void footer() …

IDEA爪哇操作数据库

少小离家老大回,乡音无改鬓毛衰 ⒈.IDEA2018设置使用主题颜色 IDEA2018主题颜色分为三种&#xff1a;idea原始颜色&#xff0c;高亮色&#xff0c;黑色 设置方法&#xff1a;Settings–Appearance&Behavior–Appearance ⒉.mysql中&#xff0c;没有my.ini&#xff0c;只有…

计算机视觉中的自监督学习

如何只使用少量标记示例来训练模型&#xff1f; 到目前为止&#xff0c;人工智能所提供的大部分价值都来自于在日益庞大的数据集上训练的监督模型。其中许多数据集都是由人类标记的&#xff0c;这是一项枯燥、耗时、容易出错&#xff0c;有时还很昂贵的工作。自监督学习&#x…

JVM基础面试题

JDK、JRE、JVM的关系 JVM Java虚拟机&#xff0c;它只识别.class类型文件&#xff0c;它能将class文件中的字节码指令进行识别并调用操作系统向上的API完成动作。 JRE Java运行时环境。它主要包含两部分&#xff1a;Jvm的标准实现和Java的一些基本类库。相对于JVM来说,JRE多出来…

【狂神】SpringMVC笔记(一)之详细版

1.Restful 风格 概念&#xff1a; 实现方式&#xff1a; 使用PathVariable 在url相同的情况下&#xff0c;会根据请求方式的不同来执行不同的方法。 使用RestFull风格的好处&#xff1a;简洁、高效、安全 2、接受请求参数及数据回显 2.1、请求参数 方式一&#xff1a;这里…

无涯教程-JavaScript - TIME函数

描述 TIME函数返回特定时间的十进制数。如果在输入功能之前单元格格式为"常规",则输出格式为日期。 TIME返回的十进制数是一个介于0(零)到0.99988426之间的值,代表从0:00:00(12:00:00 AM)到23:59:59(11:59:59 P.M.)的时间。 语法 TIME (hour, minute, second)争论…

Android studio 调整jar包顺序

第一步&#xff1a;编译jar包&#xff0c;放入lib路径下&#xff1a;如&#xff1a; 第二步&#xff1a;app 目录下build.gradle 中添加 compileOnly files(libs/classes.jar) 第三步&#xff1a;project目录下build.gradle 中添加 allprojects {gradle.projectsEvaluated {t…

十四、MySQL(DCL)如何实现用户的简单管理?配置用户?

1、DCL语句&#xff1a; 要学习DCL语言&#xff0c;就要清楚DCL语言是用来干什么的&#xff0c;首先DCL语言英文全称是Data Control Language&#xff0c;是数据控制语言&#xff0c;主要用来管理数据库用户、控制数据库的访问权限/ 2、DCL的基础语法&#xff1a; &#xff08;…

SpringBoot项目启动时预加载

SpringBoot项目启动时预加载 Spring Boot是一种流行的Java开发框架&#xff0c;它提供了许多方便的功能来简化应用程序的开发和部署。其中一个常见的需求是在Spring Boot应用程序启动时预加载一些数据或执行一些初始化操作。 1. CommandLineRunner 和 ApplicationRunner Spri…

垃圾回收 - 标记压缩算法

压缩算法是将标记清除算法与复制算法相结合的产物。 1、什么是标记压缩算法 标记压缩算法是由标记阶段和压缩阶段构成。 首先&#xff0c;这里的标记阶段和标记清除算法时提到的标记阶段完全一样。 接下来我们要搜索数次堆来进行压缩。压缩阶段通过数次搜索堆来重新填充活动对…

mtbatisplus

title: mybatis_plus date: 2023-09-03 21:06:27 tags: mybatis_plusreviews 约定大于配置 默认 当我们要使用mybatisplus的时候 我们需要去集成mp提供的BaseMapper public interface UserMapper extends BaseMapper 关于mybatisplus常用注解 注解到类上 TableName(“表…

【c++】只出现一次的数字I II III(三个版本:三道题)

注&#xff1a;看这篇文章之前你需要了解& | ^ << >> 这五个运算符&#xff0c;此外&#xff0c;代码均经过测试运行通过 目录 1、只出现一次的数字I&#xff08;难度&#xff1a;简单&#xff09; 2、只出现一次的数字II&#xff08;难度&#xff1a;中等&a…

Ubuntu之apt-get系列--apt-get安装软件的方法/教程

原文网址&#xff1a;Ubuntu之apt-get系列--apt-get安装软件的方法/教程_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Ubuntu使用apt-get安装软件的方法。 安装软件 先更新列表 sudo apt-get update 安装软件 sudo apt-get install <package name>[<version>]…

importlib的使用、9个视图子类、视图集、drf之路由、drf之请求响应回顾、GenericViewSet相关流程图

一 drf之请求响应回顾 # 1 drf请求-请求对象&#xff1a;data&#xff0c;query_params&#xff0c;其他跟之前一样&#xff0c;FILES-默认&#xff1a;支持三种编码-局部配置&#xff1a;视图类中-from rest_framework.parsers import JSONParser, FormParser, MultiPartPars…

MySQL的故事——MySQL架构与历史

MySQL架构与历史 文章目录 MySQL架构与历史一、MySQL逻辑架构二、并发控制三、事务四、多版本并发控制(MVCC) 一、MySQL逻辑架构 第一层&#xff1a;连接处理、授权认证、安全等等 第二层&#xff1a;查询解析、分析、优化、缓存以及所有的内置函数。包含跨存储引擎的功能&…

【数据结构与算法】十大经典排序算法

文章目录 前言一、常见十大排序算法总结1、名词解释2、时间复杂度 二、排序算法与C语言实现1、冒泡排序2、选择排序3、插入排序4、希尔排序5、归并排序6、快速排序7、堆排序8、计数排序9、桶排序10、基数排序 总结 前言 排序算法是《数据结构与算法》中最基本的算法之一。 排序…

java:操作cookie

背景 cookie 是一种客户端会话技术&#xff0c;将数据保存到客户端。主要流程就是&#xff1a; 1、服务器把数据设置到cookie并返回给浏览器 2、浏览器自动保存 3、浏览器下一次发送请求自动携带cookie给服务器 我们主要来看一下 java 是怎么操作 cookie 的。 cookie介绍 特…

区块链技术与应用 - 学习笔记2【密码学基础】

大家好&#xff0c;我是比特桃。本系列笔记只专注于探讨研究区块链技术原理&#xff0c;不做其他违反相关规定的讨论。 区块链技术已被纳入国家十四五规划&#xff0c;在“加快数字发展 建设数字中国”篇章中&#xff0c;区块链被列为“十四五”七大数字经济重点产业之一&#…