【OpenCV 例程300篇】40. 图像分段线性灰度变换

『youcans 的 OpenCV 例程300篇 - 总目录』


【youcans 的 OpenCV 例程300篇】40. 图像分段线性灰度变换


分段线性变换函数可以增强图像各部分的反差,增强感兴趣的灰度区间、抑制不感兴趣的灰度级。

分段线性函数的优点是可以根据需要拉伸特征物的灰度细节,一些重要的变换只能用分段函数来描述和实现,缺点则是参数较多不容易确定。

分段线性函数通用公式如下:
Dt={caD,0≤D<ad−cb−a[D−a]+c,a≤D≤bf−de−b[D−b]+d,b<D≤eDt = \begin{cases} \dfrac{c}{a} D &, 0 \leq D < a\\ \dfrac{d-c}{b-a}[D-a]+c &, a \leq D \leq b\\ \dfrac{f-d}{e-b}[D-b]+d &, b < D \leq e\\ \end{cases} Dt=acDbadc[Da]+cebfd[Db]+d,0D<a,aDb,b<De
式中,D 为原始图像的灰度值,Dt 为线性灰度变换后的图像灰度值。


例程:1.50 分段线性灰度变换(对比度拉伸)

对比度拉伸可以扩展图像中的灰度级范围,从而覆盖设备的理想灰度范围。

对比度拉伸变换函数可以有不同的实现方案,如将原始灰度范围拉伸到较宽的灰度范围;或将原始灰度范围拉伸到全域灰度范围(0,255);或将原始灰度范围拉伸到较宽的灰度范围,同时对下限或上限进行截断处理。

本例程令 (r1, s1) = (rMin, 0)、(r2, s2) = (rmax, L-1),其中 rMin、rMax 表示图像中最小灰度值和最大灰度值,将原始图像的灰度级分段线性拉伸到整个范围 [0, L-1]。运行结果的左图显示本例程的拉伸变换曲线。

    # 1.50 分段线性灰度变换 (对比度拉伸)imgGray = cv2.imread("../images/Fig0310b.tif", flags=0)  # flags=0 读取为灰度图像height, width = imgGray.shape[:2]  # 图片的高度和宽度# constrast stretch, (r1,s1)=(rMin,0), (r2,s2)=(rMax,255)rMin = imgGray.min()  # 原始图像灰度的最小值rMax = imgGray.max()  # 原始图像灰度的最大值r1, s1 = rMin, 0  # (x1,y1)r2, s2 = rMax, 255  # (x2,y2)imgStretch = np.empty((width, height), np.uint8)  # 创建空白数组k1 = s1 / r1  # imgGray[h,w] < r1:k2 = (s2-s1) / (r2-r1)  # r1 <= imgGray[h,w] <= r2k3 = (255-s2) / (255-r2)  # imgGray[h,w] > r2for h in range(height):for w in range(width):if imgGray[h,w] < r1:imgStretch[h,w] = k1 * imgGray[h,w]elif r1 <= imgGray[h,w] <= r2:imgStretch[h,w] = k2 * (imgGray[h,w] - r1) + s1elif imgGray[h,w] > r2:imgStretch[h,w] = k3 * (imgGray[h,w] - r2) + s2plt.figure(figsize=(10,3.5))plt.subplots_adjust(left=0.2, bottom=0.2, right=0.9, top=0.8, wspace=0.1, hspace=0.1)plt.subplot(131), plt.title("s=T(r)")x = [0, 96, 182, 255]y = [0, 30, 220, 255]plt.plot(x, y)plt.axis([0,256,0,256])plt.text(105, 25, "(r1,s1)", fontsize=10)plt.text(120, 215, "(r2,s2)", fontsize=10)plt.xlabel("r, Input value")plt.ylabel("s, Output value")plt.subplot(132), plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255), plt.title("Original"), plt.axis('off')plt.subplot(133), plt.imshow(imgStretch, cmap='gray', vmin=0, vmax=255), plt.title("Stretch"), plt.axis('off')plt.show()

在这里插入图片描述

(本节完)

附注:
根据博友 zhashung001 的意见,将 LUT 实现方法贴出,供读者参考:


def MMST(img):  # Max-min strength transformationrMin = img.min()  # 原始图像灰度的最小值rMax = img.max()  # 原始图像灰度的最大值imgStretch = 255. * (img-rMin) / (rMax-rMin)  # 注意 255.0 而不是255imgStretch = np.uint8(imgStretch + 0.5)return imgStretchdef DLST(img, x1, y1, x2, y2):  # divided linear strength transformation# 分段线性拉伸变换, divided linear strength transformationlut = np.zeros(256)for i in range(256):if i < x1:lut[i] = (y1/x1) * i  # k1=y1/x1elif i < x2:lut[i] = (y2-y1)/(x2-x1) * (i-x1) + y1  # k2=(y2-y1)/(x2-x1)else:lut[i] = (255.-y2)/(255.-x2) * (i-x2.) + y2  # k3=(255-y2)/(255-x2)imgStretch = cv2.LUT(img, lut)imgStretch = np.uint8(imgStretch + 0.5)return imgStretch# 1.51 对比度拉伸 (DLST 和 Max-Min Stretch)imgGray = cv2.imread("../images/Fig0310b.tif", flags=0)  # flags=0 读取为灰度图像height, width = imgGray.shape[:2]  # 图片的高度和宽度# constrast stretch, (r1,s1)=(rMin,0), (r2,s2)=(rMax,255)rMin = imgGray.min()  # 原始图像灰度的最小值rMax = imgGray.max()  # 原始图像灰度的最大值r1, s1 = rMin, 0  # (x1,y1)r2, s2 = rMax, 255  # (x2,y2)imgStretch1 = DLST(imgGray, r1, s1, r2, s2)  # 调用子程序 DLST(Divided linear strength)imgStretch2 = MMST(imgGray)  # 调用子程序 MMST(Max-Min strength)plt.figure(figsize=(10, 6))plt.subplot(131), plt.imshow(imgGray, cmap='gray', vmin=0, vmax=255), plt.title("Original"), plt.axis('off')plt.subplot(132), plt.imshow(imgStretch1, cmap='gray', vmin=0, vmax=255), plt.title("DLST Stretch"), plt.axis('off')plt.subplot(133), plt.imshow(imgStretch2, cmap='gray', vmin=0, vmax=255), plt.title("Max-Min Stretch"), plt.axis('off')plt.show()

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125112487)
Copyright 2022 youcans, XUPT
Crated:2021-11-18

【第4章:灰度变换与直方图】

39. 图像灰度的线性变换
40. 图像分段线性灰度变换
41. 图像的灰度变换(灰度级分层)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565978.shtml

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

相关文章

Ajax链接输出数据库

使用Ajax链接数据库并且获取数据库里的内容显示在页面 两大步骤&#xff1a; 设计并实现数据库进行数据库链接并获取数据库内容显示 先看效果图 没有查询并显示数据之前效果 点击查询按钮之后获取数据库内容显示在页面 下面进行程序的讲解 一 数据库的设计及实现 新建一…

【OpenCV 例程200篇】41. 图像的灰度变换(灰度级分层)

『youcans 的 OpenCV 例程200篇 - 总目录』 【OpenCV 例程200篇】41. 图像的灰度变换&#xff08;灰度级分层&#xff09; 线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。 分段线性变换函数可以增强图像各部分的反差&#xff0c;增强感兴趣…

python学习服务器端socket建立

C/S模式简介 Tcp通信模型 Udp通信模型 python标准库中的socket模块 用socket建立TCP服务器端 用socket建立UDP服务器端 socket TCP服务器端测试代码 #coding:utf-8 import socket#Host表示为本机地址 HOST PORT3214#默认为IPV4,TCP协议 ssocket.socket() s.bind((HOST,PORT))s.…

【OpenCV 例程200篇】42. 图像的灰度变换(比特平面分层)

『youcans 的 OpenCV 例程200篇 - 总目录』 【OpenCV 例程200篇】42. 图像的灰度变换&#xff08;比特平面分层&#xff09; 线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。 分段线性变换函数可以增强图像各部分的反差&#xff0c;增强感兴…

SQLServer奇偶数的输出

编写SQLServer程序分别输出1-100内的奇数和偶数 一 1-100内奇数的输出 执行语句 declare number intset number1while number<101beginif number%21begin print numberendset number1end奇数输出的效果图 二 1-100内偶数的输出 执行语句 declare number intset number1…

python学习socket的客户端实现

服务端见点击打开链接 socket的异常 socket的TCP和UDP客户端模型 TCP的客户端 import socket#ip:127.0.0.1,port 3214 HOST #warning:Ip addr can only be dropped in server! PORT3214#AF_INET IPV4 #SOCK_DGRAM UDP ssocket.socket()#try to receive data from server &…

【OpenCV 例程200篇】43. 图像的灰度变换(对数变换)

『youcans 的 OpenCV 例程200篇 - 总目录』 【OpenCV 例程200篇】43. 图像的灰度变换&#xff08;对数变换&#xff09; 线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。 对数变换可以由以下公式描述&#xff1a; Dtc∗log(1D)Dt c * log(1…

【OpenCV 例程200篇】45. 图像的灰度直方图(cv2.calcHist)

『youcans 的 OpenCV 例程200篇 - 总目录』 【OpenCV 例程200篇】45. 图像的灰度直方图 图像直方图是反映图像像素分布的统计表&#xff0c;横坐标代表像素值的取值区间&#xff0c;纵坐标代表每一像素值在图像中的像素总数或者所占的百分比。 灰度直方图是图像灰度级的函数&am…

【OpenCV 例程200篇】44. 图像的灰度变换(伽马变换)

『youcans 的 OpenCV 例程200篇 - 总目录』 【OpenCV 例程200篇】44. 图像的灰度变换&#xff08;伽马变换&#xff09; 线性灰度变换将原始图像灰度值的动态范围按线性关系扩展到指定范围或整个动态范围。 幂律变换也称伽马变换&#xff0c;可以提升暗部细节&#xff0c;对发…

【OpenCV 例程300篇】46. 直方图处理之直方图均衡化(cv2.equalizeHist)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】46. 直方图处理之直方图均衡化&#xff08;cv2.equalizeHist&#xff09; 图像直方图是反映图像像素分布的统计表&#xff0c;横坐标代表像素值的取值区间&#xff0c;纵坐标代表每一像素值在图像中的…

【OpenCV 例程300篇】47. 直方图处理之直方图匹配

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】47. 直方图处理之直方图匹配 图像直方图是反映图像像素分布的统计表。 灰度直方图是图像灰度级的函数&#xff0c;用来描述每个灰度级在图像矩阵中的像素个数。 直方图均衡直接对图像全局进行均衡化…

lingo入门(数据部分)

lingo入门(数据部分) 在数据部分也可以指定一些标量变量&#xff08;scalar variables&#xff09;。当一个标量变量在数据部 分确定时&#xff0c;称之为参数。 data: interest_rate .085; enddata还可以指定几个参数data: interest_rate,inflation_rate .085 .03; enddata如…

我的Go+语言初体验——(1)超详细安装教程

我的Go语言初体验——&#xff08;1&#xff09;超详细安装教程 “我的Go语言初体验” | 征文活动进行中… Go 是什么&#xff1f;为数据而生&#xff0c;实现教学、工程与数据的 “三位一体”。 Go 语言的安装和环境配置有些复杂&#xff0c;官方教程也没有写的很详细。 本文…

JAVA增删查改的实现

java程序对SQLServer数据库的数据进行增删查的操作&#xff0c;结果在控制台输出 步骤详解&#xff1a; 设计并实现数据库在数据库中插入相应的数据链接SQLServer数据库实现对数据库的查增删等功能 数据库内容效果图 下面讲述JAVA代码 目录结构 1 . 数据库链接&#xff…

Mac下配置sublime实现LaTeX

在Mac上通过Sublime、Skim编辑LaTeX Sublime Text是一款非常优秀的编辑器&#xff0c;速度快&#xff0c;界面简洁&#xff0c;插件众多。并且能跨平台使用&#xff0c;在Mac和Windows上都能完美使用。虽然是一款付费软件&#xff0c;但作者很厚道地给了无限期的试用期限。这一…

我的Go+语言初体验——(2)IDE 详细安装教程

我的Go语言初体验——&#xff08;2&#xff09;IDE 详细安装教程 “我的Go语言初体验” | 征文活动进行中… Go 语言的安装和环境配置有些复杂&#xff0c;官方教程也没有写的很详细。 通过控制台编写和运行 Go 程序很不方便。本文从零开始&#xff0c;详细介绍 Go 集成开发环…

GoogleNet网络详解与keras实现

GoogleNet网络详解与keras实现 GoogleNet网络详解与keras实现GoogleNet系列网络的概览Pascal_VOC数据集第一层目录第二层目录第三层目录 InceptionV1模块介绍Inception的架构GoogleNet的图片Keras代码实现为了搭建Inception网络我们使用了以下策略整个代码的流程如下 实验结果实…

循环输出

使用foreach循环输出List中的数据 步骤详解&#xff1a; 1.数据库的设计和实现 2. Java代码的书写 3. jsp页面的显示 效果图展示 数据库数据 查询结果的显示 功能分析&#xff1a; 链接数据库查找数据库内容把这些内容放入List数组里面用session传递jsp页面获取session内…

我的Go+语言初体验——(4)零基础学习 Go+ 爬虫

我的Go语言初体验——&#xff08;4&#xff09;零基础学习 Go 爬虫 “我的Go语言初体验” | 征文活动进行中… Go 语言非常适合编写爬虫程序&#xff0c;具有并发机制完善、并发数量大、占用资源少、运行速度快、部署方便的优点。 本文结合官方文档与 Go 语言的资料&#xff…