Python图像处理之图像的灰度线性变换
作者:华为云开发者联盟??????? 发布时间:2021-12-16 22:30:58
一.图像灰度线性变换原理
图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。
灰度线性变换的计算公式如下所示:
该公式中DB表示灰度线性变换后的灰度值,DA表示变换前输入图像的灰度值,α和b为线性变换方程f(D)的参数,分别表示斜率和截距。
当α=1,b=0时,保持原始图像
当α=1,b!=0时,图像所有的灰度值上移或下移
当α=-1,b=255时,原始图像的灰度值反转
当α>1时,输出图像的对比度增强
当0<α<1时,输出图像的对比度减小
当α<0时,原始图像暗区域变亮,亮区域变暗,图像求补
如图所示,显示了图像的灰度线性变换对应的效果图:
二.图像灰度上移变换
该算法将实现图像灰度值的上移,从而提升图像的亮度,其实现代码如下所示。由于图像的灰度值位于0至255区间之内,所以需要对灰度值进行溢出判断。
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('miao.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像灰度上移变换 DB=DA+50
for i in range(height):
for j in range(width):
if (int(grayImage[i,j]+50) > 255):
gray = 255
else:
gray = int(grayImage[i,j]+50)
result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
其输出结果如下图所示,图像的所有灰度值上移50,图像变得更白了。注意,纯黑色对应的灰度值为0,纯白色对应的灰度值为255。
三.图像对比度增强变换
该算法将增强图像的对比度,Python实现代码如下所示:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('miao.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像对比度增强变换 DB=DA*1.5
for i in range(height):
for j in range(width):
if (int(grayImage[i,j]*1.5) > 255):
gray = 255
else:
gray = int(grayImage[i,j]*1.5)
result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
其输出结果如下图所示,图像的所有灰度值增强1.5倍。
四.图像对比度减弱变换
该算法将减弱图像的对比度,Python实现代码如下所示:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('miao.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像对比度减弱变换 DB=DA*0.8
for i in range(height):
for j in range(width):
gray = int(grayImage[i,j]*0.8)
result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
其输出结果如下图所示,图像的所有灰度值减弱,图像变得更暗。
五.图像灰度反色变换
反色变换又称为线性灰度求补变换,它是对原图像的像素值进行反转,即黑色变为白色,白色变为黑色的过程。其Python实现代码如下所示:
# -*- coding: utf-8 -*-
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取原始图像
img = cv2.imread('miao.png')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
#创建一幅图像
result = np.zeros((height, width), np.uint8)
#图像灰度反色变换 DB=255-DA
for i in range(height):
for j in range(width):
gray = 255 - grayImage[i,j]
result[i,j] = np.uint8(gray)
#显示图像
cv2.imshow("Gray Image", grayImage)
cv2.imshow("Result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
其输出结果如下图所示,图像处理前后的灰度值是互补的。
图像灰度反色变换在医学图像处理中有一定的应用,如下图所示:
来源:https://juejin.cn/post/7136440999479345182


猜你喜欢
- 这篇文章主要介绍了python打包成so文件过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 学习前言神经网络的应用还有许多,目标检测就是其中之一,目标检测中有一个很重要的概念便是IOU什么是IOUIOU是一种评价目标检测器的一种指标
- 准备工作:MyEclipse使用的是2013版,mysql Ver 14.14 Distrib 5.6.281.jar包的下载(jdbc驱动
- * 页爬取是爬虫学习中的一个难点。本文将以知名插画网站pixiv为例,简要介绍 * 页爬取的方法。写在前面本代码的功能是输入画师的pixi
- 每次在操作数据库的时候最烦的就是根据表单提交的内容写sql语句,特别是字段比较多的时候很麻烦,动不动就容易写错。所以我就写了下面的生成sql
- 项目中用到了限流,受限于一些实现方式上的东西,手撕了一个简单的服务端限流器。服务端限流和客户端限流的区别,简单来说就是:1)服务端限流对接口
- mysql 时间转换函数的用法DAYOFWEEK(date) 返回日期date的星期索引(1=星期天,2=
- 本文给大家分享一个远程更新目标库数据的存储过程,适用于更新列名一致,主键为Int类型,可远程链接的数据库。USE [Table]--切换到源
- //主键 ALTER TABLE tablename add new_field_id int(5) UNSIGNED DEFAULT 0
- 实例如下:var aaa = { "0":"a", "1"
- 当我们想复制两个一模一样的列表时,我们可能使用到list.copy()这个方法,这个方法可以让我们复制一个相同的数组,当遇到下面这种情况时,
- 使用transaction: var stopwatch = new Stopwatch(); us
- 本文实例为大家分享了vue实现购物车加减的具体代码,供大家参考,具体内容如下通常我们会在模板中绑定表达式,模板是用来描述视图结构的。如果模板
- 有一个txt文本如下:151 151 1234561 156421 214156 1523132 031320现希望将两行合并为一行,并将
- CSS3 + HTML5是未来的Web,它们都还没有正式到来,虽然不少浏览器已经开始对它们提供部分支持。本文介绍了5个CSS3技巧,可以帮你
- 如何在线删除表或索引? <%Set conn1 = Server.CreateObject(&
- 以前在使用Python的时候,都是使用root用户安装好的全局python,现在,因为root用户安装的Python版本太低,同时自己没有r
- 首先新建一个dataframe:In[8]: df = pd.DataFrame({'name':list('ABC
- ADO对象: Connection Command Recordset Record Stream ASP支持的对象很多,可以自己编写COM
- 刚才运行了一段代码,来查看Request.ServerVariables里面有多少值,看了一下,共50个!代码<%=Request.S