首页 > 编程语言 >Python图像处理丨图像的灰度线性变换

Python图像处理丨图像的灰度线性变换

时间:2022-08-27 12:07:17浏览次数:89  
标签:线性变换 Python cv2 灰度 grayImage 图像 np result

摘要:本文主要讲解灰度线性变换。

本文分享自华为云社区《[Python图像处理] 十五.图像的灰度线性变换》,作者:eastmount。

一.图像灰度线性变换原理

图像的灰度线性变换是通过建立灰度映射来调整原始图像的灰度,从而改善图像的质量,凸显图像的细节,提高图像的对比度。灰度线性变换的计算公式如下所示:

该公式中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()

其输出结果如下图所示,图像处理前后的灰度值是互补的。

图像灰度反色变换在医学图像处理中有一定的应用,如下图所示:

PS:文章参考自己以前系列图像处理文章及OpenCV库函数,同时参考如下文献:

 

点击关注,第一时间了解华为云新鲜技术~

标签:线性变换,Python,cv2,灰度,grayImage,图像,np,result
From: https://www.cnblogs.com/huaweiyun/p/16630253.html

相关文章

  • python内存管理机制
    python作为一门解释型语言,以代码简洁易懂著称。我们可以直接对名称赋值,而不必声明类型。名称类型的确定、内存空间的分配与释放都是由python解释器在运行时进行的。python......
  • 算法题python用法
    算法题python用法大写变小写往后移动一位chr(ord(v.lower())+1)大写、小写、数字i.isalpha():#英文i.isspace()#空格​ifitem.isupper():#大写     a......
  • 【技术流吃瓜】python可视化大屏舆情分析“张天爱“事件网友评论
    目录一、事件背景二、微热点分析二、自开发Python舆情分析2.1Python爬虫2.2可视化大屏2.2.1大标题2.2.2词云图2.2.3条形图2.2.4饼图(玫瑰图)2.2.5地图三、演示视频一......
  • Python 下载大文件,哪种方式速度更快
    转载:Python下载大文件,哪种方式速度更快(qq.com)方法一使用以下流式代码,无论下载文件的大小如何,Python内存占用都不会增加:def download_file(url):    local_fil......
  • flask 解决日志重复打印问题 or Python日志重复打印
    背景:业务代码上线后,莫名会重复输出很多相同的日志,已知以为是多线程问题,后仔细了解期logging原理后发现并非如此。以下为解决方案fromflaskimportFlaskas_Flaskfro......
  • 06.python闭包
    python闭包什么样的函数是闭包函数?满足以下条件:闭:外层函数嵌套了一个内层函数。包:内层函数调用外层函数命名空间内的名字。举例如下:defout_func():#外层函数......
  • 学习python-Day48
    今日学习内容JS获取用户输入有两种方式:普通数据(输入、选择)​ 标签对象.value文件数据(上传)​ 标签对象.files​ 标签对象.files[0]JS类属性操作let标签......
  • Python枚举用法_Enum
    #-*-coding:utf-8-*-fromenumimportEnum,unique#1.枚举的定义#首先,定义枚举要导入enum模块。#枚举定义用class关键字,继承Enum类。#2.如果要限制定......
  • 【2022-08-26】python前端开发(五)
    python前端开发(五)JS获取值操作普通数据(输入、选择) 标签对象.value文件数据(上传) 标签对象.files 标签对象.files[0]leti1Ele=document.getElementById('d1......
  • 10个python基础技巧
    下面有几个python初学者不知道的技巧,学会了可以大大提升代码的简洁性和便捷性。1、真值比较初学者经常在if语句中使用==比较符来判断表达式是否为真值#错误写法a=Tru......