图像处理-Contrast Stretching
ztj100 2025-01-05 01:01 33 浏览 0 评论
# 关于对比度
在图像中,对比度指明暗程度,对比度高说明物体相对于其他更容易分辨。如下图,左边低对比度图像看起来雾蒙蒙的,很难区分其中的细节,右边高对比度图像就好像在夏天,光线充足,看得很清楚。
再通过像素强度图来看两张图的像素分布,低对比度图像强度分布比较集中,而高对比图强度分散在整个区域,如下分别是两张图片的histogram图:
造成图像低对比度的原因有拍照时周围环境较暗,廉价的图像传感器,或者是系统错误的设置。
# 如何提高对比度?
根据上面的histogram图,可以看到,要提高对比度,我们需要把分布集中的像素分散开,是指分布到整个区域(0-255)。
根据转换函数的不同,增强对比度的方式分为**线性**和**非线性**。线性方式有Contrast-Stretching,基于分段线性函数,非线性方式包括Histogram Equilisation和Gaussian Stretch等,都是基于非线性函数来转换histogram图。
本文将详细介绍基于线性函数方式的Contrast-Stretching方法。Contrast-Stretching是基于分段的线性函数,每段函数都是递增函数,如下图:
通过改变(r1, s1)和(r2, s2),转换函数也随之改变,r和s代表像素强度值。
- 如果r1=r2, s1=s2, 则函数变成一个线性函数
- 如果r1=r2, s1=0, s2=L-1, 则函数变成一个thresholding函数
- 如果(r1,s1)=(r_min, 0), (r2, s2)=(r_max, L-1), 则函数变成Min-Max Stretching函数
- 如果(r1,s1)=(r_min + c, 0), (r2, s2)=(r_max - c, L-1), 则函数变成Percentile Stretching函数
接下来着重讲解Min-Max Stretching和Percentile Stretching函数。
在Min-Max 拉伸中,输入图像的最小值与最大值将被分别映射到数值区域的最大和最小(0和255),比如最小像素值为50,转换后对应为0,最大值200经过转换后为255,位于最大值与最小值区间的值则被映射到0-255之间。Min-Max计算公式如下:
经过Min-Max操作后,对比如下:
两者对比之后会看到,下面的图清晰了一点,histogram图可以发现像素值向两边分散了一点,但是不是很明显,区域两端的像素值分区仍然很少,后期可以配合使用Percentile Stretching使用。
代码如下:
import cv2
import numpy as np
# Read the image
img1 = cv2.imread('D:/downloads/contrast.PNG',0)
# Create zeros array to store the stretched image
minmax_img = np.zeros((img1.shape[0],img1.shape[1]),dtype = 'uint8')
min_v = np.min(img1)
max_v = np.max(img1)
# Loop over the image and apply Min-Max formulae
for i in range(img1.shape[0]):
for j in range(img1.shape[1]):
minmax_img[i,j] = 255*(img1[i,j]-min_v)/(max_v-min_v)
# Displat the stretched image
cv2.imshow('Minmax',minmax_img)
cv2.waitKey(0)
参考:
- https://theailearner.com/2019/01/30/what-is-contrast-in-image-processing/
- https://docs.opencv.org/3.1.0/d5/daf/tutorial_py_histogram_equalization.html
相关推荐
- 再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)
-
在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...
- python创建分类器小结(pytorch分类数据集创建)
-
简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...
- matplotlib——绘制散点图(matplotlib散点图颜色和图例)
-
绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...
- python实现实时绘制数据(python如何绘制)
-
方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...
- 简单学Python——matplotlib库3——绘制散点图
-
前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...
- 数据分析-相关性分析可视化(相关性分析数据处理)
-
前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...
- 免费Python机器学习课程一:线性回归算法
-
学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...
- 用Python进行机器学习(2)之逻辑回归
-
前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...
- 【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂
-
一、拟合和回归的区别拟合...
- 推荐2个十分好用的pandas数据探索分析神器
-
作者:俊欣来源:关于数据分析与可视化...
- 向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- 用Python进行机器学习(11)-主成分分析PCA
-
我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...
- 神经网络基础深度解析:从感知机到反向传播
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- Python实现基于机器学习的RFM模型
-
CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)