『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=⎩⎨⎧​ac​Db−ad−c​[D−a]+ce−bf−d​[D−b]+d​,0≤D<a,a≤D≤b,b<D≤e​
式中,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. 图像的灰度变换(灰度级分层)

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

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

    [OpenCV 例程200篇]40. 图像分段线性灰度变换 欢迎关注 『OpenCV 例程200篇』 系列,持续更新中 欢迎关注 『Python小白的OpenCV学习课』 系列,持续更新中 分段线性变 ...

  2. 【youcans的OpenCV例程300篇】总目录

    版权声明: 转载本系列作品时必须标注以下版权内容: [youcans@qq.com, youcans的OpenCV 例程300篇, https://blog.csdn.net/youcans/cate ...

  3. 【OpenCV 例程300篇】202. 查表快速替换(cv.LUT)

    OpenCV 例程200篇 总目录 201. 图像的颜色空间转换 202. 查表快速替换(cv.LUT) 203. 伪彩色图像处理 204. 图像的色彩风格滤镜 205. 调节色彩平衡/饱和度/明度 ...

  4. 【OpenCV 例程 300 篇】107. 退化图像的维纳滤波

    专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』 [第 7 章:图像复原与重建] 106. 退化图像的逆滤波 107. 退化图像的维纳滤波 108. 约束最小二乘方滤波 10 ...

  5. 【OpenCV 例程 300 篇】112. 滤波反投影重建图像

    专栏地址:『youcans 的 OpenCV 例程 300篇 - 总目录』 [第 7 章:图像复原与重建] 110. 投影和雷登变换 111. 雷登变换反投影重建图像 112. 滤波反投影重建图像 [ ...

  6. 【OpenCV 例程300篇】01. 图像的读取(cv2.imread)

    专栏地址:『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取(cv2.imread) 02. 图像的保存(cv2.imwrite) 03. 图像的显示(cv2.imsh ...

  7. 【OpenCV 例程300篇】204. 图像的色彩风格滤镜

    OpenCV 例程200篇 总目录 201. 图像的颜色空间转换 202. 查表快速替换(cv.LUT) 203. 伪彩色图像处理 204. 图像的色彩风格滤镜 205. 调节色彩平衡/饱和度/明度 ...

  8. 【OpenCV 例程300篇】02. 图像的保存(cv2.imwrite)

    专栏地址:『youcans 的 OpenCV 例程300篇 - 总目录』 01. 图像的读取(cv2.imread) 02. 图像的保存(cv2.imwrite) 03. 图像的显示(cv2.imsh ...

  9. 【OpenCV 例程 300篇】253. 多帧图像(动图)的读取与保存

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]253. 多帧图像(动图)的读取与保存 1. 多帧图像(动图) 多帧图像是将多幅图像 ...

最新文章

  1. spring-boot入门之二——验证、AOP日志、异常处理
  2. 选好的两组台式机配置
  3. 【MFC】CWinApp类详解
  4. Linux调度系统全景指南(终结篇)
  5. Docker最全教程——MongoDB容器化(十三)
  6. 用pythone画棵圣诞树,祝大家圣诞快乐
  7. simulink将值传递给mask封装下的模块
  8. pluswell双机软件基本概述
  9. Spark On YARN内存分配
  10. 定制Ubuntu桌面
  11. #pragma 是什么
  12. 浅析JSP动态网页开发技术
  13. Multisim 14元件伏安特性测量
  14. 【转载】9个offer,12家公司,35场面试,从微软到谷歌
  15. python对excel中需要的数据的单元格填充颜色
  16. PDC10与最后的恐慌者
  17. Box-constrained L-BFGS 相关知识拓展
  18. KenLM语言模型工具
  19. Unity3d架构之-Unity MVC框架 StrangeIoC
  20. 智力考验看成语猜古诗句微信小程序源码下载好玩解闷小游戏

热门文章

  1. H5页面微信授权登录——前端部分
  2. Mac更新后NetKeeper用不了怎么办?
  3. QT-简单的CNC控制面板
  4. 深圳大学 计算机 教育部学科,深圳大学有13个A类学科,位居全国第24!
  5. 英文简历中地址应该怎么翻译?
  6. 【系统】《写给大忙人看的操作系统》--研读
  7. 用NCBI的工具Batch Entrez批量下载序列
  8. 计算机一级试题怎么保存上网,计算机一级试题中上网部分怎么保存文件
  9. Origin 2017调整画布和图表的尺寸大小
  10. anaconda安装多环境