一、灰度线性变换

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

g(x)=αf(x)+β

(1)图像灰度上移变换:DB=DA + 50
(2)图像对比度增强变换:DB=DA * 1.5
(3)图像对比度减弱变换:DB=DA * 0.8
(4)图像灰度反色变换:DB=255 - DA

注意:由于图像的灰度值位于 0 至 255 区间之内,所以需要对灰度值进行溢出判断

有以下几种情况:
<1>当 α=1,b=0 时,保持原始图像
<2>当 α=1,b!=0 时,图像所有的灰度值上移或下移-----------(提升图像的亮度)
<3>当 α=-1,b=255 时,原始图像的灰度值反转
<4>当 α>1 时,输出图像的对比度增强
<5>当 0<α<1 时,输出图像的对比度减小
<6>当 α<0 时,原始图像暗区域变亮,亮区域变暗,图像求补

下面看具体的代码演示:

示例1:图像灰度上移变换

图像的所有灰度值上移 50,图像变得更白了。
注意:纯黑色对应的灰度值为 0,纯白色对应的灰度值为 255

import cv2
import numpy as np
from matplotlib import pyplot as pltimg=cv2.imread("lena.png")
grayImg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#获取图像的高和宽
grayImg_height=grayImg.shape[0]
grayImg_width=grayImg.shape[1]#创建新图像
newImg_move=np.zeros((grayImg_height,grayImg_width),np.uint8)#上移#DB=DA+50 上移
for i in range(grayImg_height):for j in range(grayImg_width):if(int(grayImg[i,j]+50)>255):# 溢出判断gray=255else:gray=int(grayImg[i,j]+50)newImg_move[i,j]=np.uint8(gray)plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题#原始图像
img0=plt.subplot(1,2,1)
img0.set_title("原始图像")
plt.imshow(grayImg,cmap="gray")
plt.xticks([])
plt.yticks([])# newImg_move 上移
img1=plt.subplot(1,2,2)
img1.set_title("灰色上移变换")
plt.imshow(newImg_move,cmap="gray")
plt.xticks([])
plt.yticks([])plt.show()
cv2.waitKey(0)

运行结果:

示例2:图像对比度增强变换

import cv2
import numpy as np
from matplotlib import pyplot as pltimg=cv2.imread("lena.png")
grayImg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#获取图像的高和宽
grayImg_height=grayImg.shape[0]
grayImg_width=grayImg.shape[1]#创建新图像
newImg_increase=np.zeros((grayImg_height,grayImg_width),np.uint8)#对比度增强# DB=DA*1.5 对比度增强
for i in range(grayImg_height):for j in range(grayImg_width):if(int(grayImg[i,j]*1.5)>255):gray=255else:gray=int(grayImg[i,j]*1.5)newImg_increase[i,j]=np.uint8(gray)plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题#原始图像
img0=plt.subplot(1,2,1)
img0.set_title("原始图像")
plt.imshow(grayImg,cmap="gray")
plt.xticks([])
plt.yticks([])# newImg_increase 对比度增强
img2=plt.subplot(1,2,2)
img2.set_title("对比度增强")
plt.imshow(newImg_increase,cmap="gray")
plt.xticks([])
plt.yticks([])plt.show()
cv2.waitKey(0)

运行结果:

示例3:图像对比度减弱变换

import cv2
import numpy as np
from matplotlib import pyplot as pltimg=cv2.imread("lena.png")
grayImg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#获取图像的高和宽
grayImg_height=grayImg.shape[0]
grayImg_width=grayImg.shape[1]#创建新图像
newImg_decrease=np.zeros((grayImg_height,grayImg_width),np.uint8)#对比度减弱# DB=DA*0.8 对比度减弱
for i in range(grayImg_height):for j in range(grayImg_width):gray=int(grayImg[i,j])*0.8newImg_decrease[i,j]=np.uint8(gray)plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题#原始图像
img0=plt.subplot(1,2,1)
img0.set_title("原始图像")
plt.imshow(grayImg,cmap="gray")
plt.xticks([])
plt.yticks([])# newImg_decrease 对比度减弱
img3=plt.subplot(1,2,2)
img3.set_title("对比度减弱")
plt.imshow(newImg_decrease,cmap="gray")
plt.xticks([])
plt.yticks([])plt.show()
cv2.waitKey(0)

运行结果:

示例4:图像灰度反色变换

import cv2
import numpy as np
from matplotlib import pyplot as pltimg=cv2.imread("lena.png")
grayImg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#获取图像的高和宽
grayImg_height=grayImg.shape[0]
grayImg_width=grayImg.shape[1]#创建新图像
newImg_reverse=np.zeros((grayImg_height,grayImg_width),np.uint8)#反转/求补# DB=255-DA 反转/求补
for i in range(grayImg_height):for j in range(grayImg_width):gray=255-int(grayImg[i,j])newImg_reverse[i,j]=np.uint8(gray)plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题#原始图像
img0=plt.subplot(1,2,1)
img0.set_title("原始图像")
plt.imshow(grayImg,cmap="gray")
plt.xticks([])
plt.yticks([])# newImg_reverse 反转/求补
img4=plt.subplot(1,2,2)
img4.set_title("图像灰度反色变换")
plt.imshow(newImg_reverse,cmap="gray")
plt.xticks([])
plt.yticks([])plt.show()
cv2.waitKey(0)

运行结果:

下面来看一个总体的代码演示:

import cv2
import numpy as np
from matplotlib import pyplot as pltimg=cv2.imread("lena.png")
grayImg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)#获取图像的高和宽
grayImg_height=grayImg.shape[0]
grayImg_width=grayImg.shape[1]#创建新图像
newImg_move=np.zeros((grayImg_height,grayImg_width),np.uint8)#上移
newImg_reverse=np.zeros((grayImg_height,grayImg_width),np.uint8)#反转/求补
newImg_increase=np.zeros((grayImg_height,grayImg_width),np.uint8)#对比度增强
newImg_decrease=np.zeros((grayImg_height,grayImg_width),np.uint8)#对比度减弱#DB=DA+50 上移
for i in range(grayImg_height):for j in range(grayImg_width):if(int(grayImg[i,j]+50)>255):# 溢出判断gray=255else:gray=int(grayImg[i,j]+50)newImg_move[i,j]=np.uint8(gray)# DB=255-DA 反转/求补
for i in range(grayImg_height):for j in range(grayImg_width):gray=255-int(grayImg[i,j])newImg_reverse[i,j]=np.uint8(gray)# DB=DA*1.5 对比度增强
for i in range(grayImg_height):for j in range(grayImg_width):if(int(grayImg[i,j]*1.5)>255):gray=255else:gray=int(grayImg[i,j]*1.5)newImg_increase[i,j]=np.uint8(gray)# DB=DA*0.8 对比度减弱
for i in range(grayImg_height):for j in range(grayImg_width):gray=int(grayImg[i,j])*0.8newImg_decrease[i,j]=np.uint8(gray)plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题
imgs=[grayImg,newImg_move,newImg_increase,newImg_decrease,newImg_reverse]
titles=["原始图像","灰色上移变换","对比度增强变换","对比度减弱变换","灰度反色变换"]for i in range(5):img0=plt.subplot(2,3,i+1)img0.set_title(titles[i])plt.imshow(imgs[i],cmap="gray")plt.xticks([])plt.yticks([])plt.show()
cv2.waitKey(0)

运行结果:

二、灰度非线性变换

(1)Gamma / 指数变换
Gamma变换是非线性变换,使输出图像灰度值与输入图像灰度值呈指数关系,公式见下图:

Gamma 变换就是用来图像增强,其提升了暗部细节,即通过非线性变换,让图像从曝光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正

当 gamma 值小于 1 时,图像的整体亮度值得到提升,同时低灰度处的对比度得到增加,更利于分辩低灰度值时的图像细节

  • Gamma变换的基本形式
    大于 1 时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),
    小于 1 时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢)
    换一种说法,就是
    当γ>1时,会拉伸图像中灰度级较高的区域,压缩灰度级较低的部分。
    当γ<1时,会拉伸图像中灰度级较低的区域,压缩灰度级较高的部分。
    当γ=1时,该灰度变换是线性的,此时通过线性方式改变原图像。

代码演示:

# Gamma变换--非线性变换
import cv2
from skimage import exposure
from matplotlib import pyplot as pltimg=cv2.imread("airport.png")
grayImg=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
gamma_img=exposure.adjust_gamma(grayImg,5)plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题
img1=plt.subplot(1,2,1)
img1.set_title("原始图像")
plt.imshow(grayImg,cmap="gray")
plt.xticks([])
plt.yticks([])img2=plt.subplot(1,2,2)
img2.set_title("Gamma变换")
plt.imshow(gamma_img,cmap="gray")
plt.xticks([])
plt.yticks([])plt.show()
cv2.waitKey(0)

运行结果:

(2)对数变换
图像灰度的对数变换是另外一种常见的灰度非线性变化。一般表示如公式所示

其中c为尺度比较常数,DA为原始图像灰度值,DB为变换后的目标灰度值。
对数变换对于整体对比度偏低并且灰度值偏低的图像增强效果较好。这种变换可用于增强图像的暗部细节,从而用来扩展被压缩的高值图像中的较暗像素

# 对数变换
import cv2
import numpy as np
from matplotlib import pyplot as plt#对数变换
def log(c,DA_img):new_img=c*np.log(1.0+DA_img)new_img=np.uint8(new_img+0.5)return new_imgimg=cv2.imread("street.jpg")
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
new_img=log(30,gray_img)plt.rcParams['font.sans-serif']=['SimHei']#解决中文乱码问题img1=plt.subplot(1,2,1)
img1.set_title("原始图像")
plt.imshow(gray_img,cmap="gray")
plt.xticks([])
plt.yticks([])img2=plt.subplot(1,2,2)
img2.set_title("对数变换")
plt.imshow(new_img,cmap="gray")
plt.xticks([])
plt.yticks([])plt.show()
cv2.waitKey(0)

运行结果:

文中描述不恰当之处,请大家批评指正,谢谢,大家共同进步。

图像处理 | 灰度线性变换与非线性变化相关推荐

  1. OpenCV计算机视觉学习(3)——图像灰度线性变换与非线性变换(对数变换,伽马变换)

    人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力.FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台.每周免费提供 ...

  2. 【数字图像处理】五.MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理详解

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片点运算处理,包括图像灰度线性变换 ...

  3. 【python图像处理】图像灰度化处理、图像灰度线性变换、图像灰度非线性变换

    一.图像灰度化处理 1.最大值灰度处理方法 2.平均灰度处理方法 3.加权平均灰度处理方法 二.图像灰度线性变换 1.图像灰度上移变换 2.图像对比度增强变换 3.图像对比度减弱变换 4.图像灰度反色 ...

  4. MFC图像点运算之灰度线性变化、灰度非线性变化、阈值化和均衡化处理

    本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程<数字图像处理>及课件进行讲解,主要通过MFC单文档视图实现显示BMP图片点运算处理,包括图像灰度线性变换 ...

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

    摘要:本文主要讲解灰度线性变换. 本文分享自华为云社区<[Python图像处理] 十五.图像的灰度线性变换>,作者:eastmount. 一.图像灰度线性变换原理 图像的灰度线性变换是通过 ...

  6. python灰度图片格式_[Python图像处理] 十五.图像的灰度线性变换

    [Python图像处理] 十五.图像的灰度线性变换 发布时间:2019-03-28 00:08, 浏览次数:619 , 标签: Python 该系列文章是讲解Python OpenCV图像处理知识,前 ...

  7. 《OpenCv视觉之眼》Python图像处理二十一:Opencv图像处理之图像线性变换和非线性变换的方法及原理

    本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的.不同方法的处理,以达到对图像进行去噪.锐 ...

  8. [Python图像处理] 十五.图像的灰度线性变换

    该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门.OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子.图像增强技术.图像分割等,后期结合深度学习研究图像识别 ...

  9. Python 图像处理OpenCV:灰度图的非线性对数变换(笔记)

    灰度图的非线性对数变换,其中c为尺度比较常数,可以通过改变c来得到不同的图形效果. 代码如下: import cv2 as cv import numpy as np import matplotli ...

最新文章

  1. 前端js判断上传是否为EXCEL表格问题
  2. C#教程6:流控制语句
  3. 在场景中输出横向或纵向压缩的中文字符
  4. 327. Count of Range Sum 区间和的个数
  5. 任意进制转化 函数 模板(一)
  6. El表达式和fn函数一起使用
  7. Spring Cloud 5分钟搭建教程(附上一个分布式日志系统项目作为参考)
  8. 实体框架提供程序类型无法加载?
  9. 牛客网--华为机试在线训练2:计算字符个数
  10. vs不能调试_20200717调试记录(五十四)
  11. 在一个字符串中找到第一个只出现一次的字符,并返回它的位置
  12. c51单片机小车代码解释
  13. linux 两台设备网桥配置6,linux2.6内核网桥分析
  14. 源码编译Redis Desktop Manager参考
  15. SDJZ2537LOL如何拯救小学生
  16. 2019 CSP-J 游记(CQ LNBS考场 的退役之战)
  17. CTGU实验6_2-创建还书存储过程
  18. 青龙面板 企业微信应用推送
  19. C#: //todo
  20. excel表格横向纵向变换_从Python到Excel

热门文章

  1. Three.js基础入门系列(九)--导入3D模型
  2. 【转】BFT类共识协议概览与分析实测
  3. 使用python多线程获取代理IP(代理IP池,附源码)
  4. Shell之字符串大小写转换
  5. java二级的等级之分_计算机二级证书的等级划分
  6. 微信模板信息群发实现
  7. python3视频教程下载_Python3完全零基础入门精讲 全套视频教程
  8. Drozer+天天模拟器环境搭建
  9. PhotoZoom2023专业的图片无损放大软件最新V8版功能介绍
  10. SQL server关联字段中出现中英文括号导致数据翻倍