python实现matlab stretchlim函数和imadjust函数

article/2025/9/25 2:24:07

matlab 代码:
[img,map]=imread(“/home/zhongjia/test.png”);
LOW_HIGH=stretchlim(img);
J=imadjust(img,[LOW_HIGH(1) LOW_HIGH(2)],[0 1],1);
 imwrite(J,"/home/zhongjia/test_result.png");  

实现功能是:对16位深度1024*1024大小的test.png图像进行自适应灰度拉伸。

stretchlim函数是寻找最合适的阈值,imadjust函数是进行灰度变换。

python代码:

(1)实现stretchlim函数

matlab 的stretchlim函数默认是将累计像素点占整个像素点比例在0.01 ~0.99之间的像素值进行灰度变换,所以以下python代码仅仅实现stretchlim默认参数情况下的功能。

计算每个像素值的像素点数量,绘制像素值直方图,找到某个阈值满足该阈值以下累计像素点数量占整个像素点(1024*1024)的比例低于0.01的像素值A1、A2、A3……,A1<A2<A3,同时找到某个像素阈值以上累计像素点占比低于0.01的像素值B1、B2、B3……,B1<B2<B3……。以A3和B1作为imadjust函数灰度变换时映射的端点

import cv2 
import numpy as np
import scipy 
from scipy import misc
import matplotlib.pyplot as plt
 
def calcGrayHist(I):
    # 计算灰度直方图
    h, w = I.shape[:2]
    #grayHist = np.zeros([256], np.uint64)
    grayHist = np.zeros([65536], np.uint64)
    for i in range(h):
        for j in range(w):
            grayHist[I[i][j]] += 1
    return grayHist
img = cv2.imread('/home/zhongjia/plasmabubble/example_wk/plasma_bubble_20130929-30/20130929195902_gpi408_3_6300_180000_B1_G3.png.raw.png',2)
plt.figure()
plt.imshow(img,cmap='Greys_r')
total_pixels = img.shape[0]*img.shape[1]
print(total_pixels)
grayHist = calcGrayHist(img)
sum = np.zeros([65536],np.uint64)
for i in range(65536):
    sum[i] = np.sum(grayHist[0:i+1])
print(sum)
cdf = np.zeros([65536],np.uint64)
cdf = sum/total_pixels
min_pix = np.where(cdf < 0.01)
max_pix =  np.where(cdf >= 1 - 0.01)

img_copy = img.copy()
img_copy = np.rot90(img_copy,-1)# 顺时针旋转90度,np.rot90(img, -1) 顺时针旋转90度
cv2.imwrite('pre_test.png',img_copy)

plt.figure()
plt.imshow(img_copy,cmap='Greys_r')

结果:

再实现imadjust函数:

matlab imadjust函数如下:

这个部分代码是将前面找到的阈值端点A3和B1输入到imadjust函数中,进行图像灰度拉伸。使得A3以下的像素值最后映射结果和A3映射结果相同,B1以上像素值映射结果和B1映射结果相同,从而将占比更大累计像素点的A3~B1像素值映射到新的像素空间。

import cv2 
import numpy as np
import scipy 
from scipy import misc
import matplotlib.pyplot as plt
 

def imadjust(img, low_in, high_in, low_out, high_out, gamma, c):
   
    #f = misc.imread(img).astype(np.int16)
    #f = misc.imread(img,2).astype(np.uint16)
    f = misc.imread(img,2)
    print(f.shape,f.dtype,f,f.max())
    plt.figure(1)
    plt.imshow(f, cmap='gray')
    plt.axis('off')
    plt.title('原始图像')
    plt.show()
    
    w, h = f.shape
    f1 = np.zeros([w, h])
    # imadjust函数运算部分
    for x in range(0, w):
        for y in range(0, h):
            if f[x, y] <= low_in:
                f1[x, y] = low_out
            elif f[x, y] >= high_in:
                f1[x, y] = high_out
            else:
                f1[x, y] = c * (f[x, y]**gamma)
    f1 = np.rot90(f1,-1)# 顺时针旋转90度,np.rot90(img, -1) 顺时针旋转90度
    scipy.misc.imsave('figure2.png', f1)
    plt.figure(2)
    plt.imshow(f1, cmap='gray')
    plt.axis('off')
    plt.title('变换图像')
    plt.show()
    
    
    plt.figure(3)
    f2 = np.abs(f-f1)     #差值的绝对值
    
    scipy.misc.imsave('figure3.png', f2)
    plt.imshow(f2, cmap='gray')
    plt.axis('off')
    plt.title('差值图像')
    plt.show()
imadjust('/home/zhongjia/plasmabubble/test.png', 740, 2218, 0, 255, 1, 1) 

注意事项:

本文是在stretchlim函数和imadjust函数中都保留图片uint16位深度,并没用直接通过imread函数读取时,先转换为uint8位深度,再进行stretch和imadjust函数变换。

如果先通过imread函数默认读取,则自动将0-65535线性映射到0-255,如下测试代码:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt
import math
import os
import glob
import shutil
import scipy 
from scipy import misc
img = cv.imread("/home/zhongjia/aurora/2005/alread_format/N20050101G_F/N050101G03508.png",0)
print(img.dtype,img.min(),img.max(),img[300][200])
# img = np.array(img,dtype='uint16')
# print(img.dtype,img.min(),img.max(),img[60][200])
# img = np.array(img,dtype='uint8')
# print(img.dtype,img.min(),img.max(),img[60][200])
img = cv.imread("/home/zhongjia/aurora/2005/alread_format/N20050101G_F/N050101G03508.png",2)
print(img.dtype,img.min(),img.max(),img[300][200])

输出结果:

从保留两位小数看,确实imread函数读取uint16位图时(0~65535),若取深度uint8,则压缩到0~255

压缩了像素值空间,有可能导致如下问题:原来像素空间里面,累积像素点占比0.01的阈值端点精确阈值是A3和B1,在新的像素空间里面,累计像素点占比0.01的点不是精确的两个阈值点,因为像素空间分辨率降低了,从65536到256,每个像素值对应的点变多了。所以原来A3阈值映射到新空间是0,B1映射到255,而现在可能是C3映射到新空间的0,D1映射到255。

我们看一下先转换uint8时,再进行后续操作的结果:


http://chatgpt.dhexx.cn/article/gsfDFwoh.shtml

相关文章

MATLAB图像处理imadjust()函数调节图像的对比度示例

imadjust()函数 Jimadjust(I) 将强度图像为I的值映射到J中的新值&#xff0c;使得1&#xff05;的数据在低强度和高强度I时饱和。这将增加了输出图像J的对比度。 J imadjust&#xff08;I&#xff0c;[LOW_IN; HIGH_IN]&#xff0c;[LOW_OUT; HIGH_OUT]&#xff09;将强度图…

matlab常用语句imadjust作用,matlab中imadjust函数的作用及应用举例

imadjust简介 imadjust是一个计算机函数&#xff0c;该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵。在matlab的命令窗口中键入&#xff1a; doc imadjust或者help imadjust就行了获得该函数的帮助信息&#xff0c; 键入type imadjust可以查看函数的源码。 调用格式&#…

matlab imadjust函数,imadjust从用法到原理—Matlab灰度变换函数之一

imadjust函数是MATLAB的一个工具箱函数,一般的语法调用格式为: f1=imadjust(f,[low_in high_in],[low_out high_out],gamma) (注:本文所述图像数据均为Uint8,对于Matlab,矩阵中的一个元素即是一个像素点) 该函数的意义如图1所示,把图像f灰度变换到新图像f1的过程中,f…

matlab imadjust函数,浅析matlab中imadjust函数

imadjust imadjust是一个计算机函数&#xff0c;该函数用于调节灰度图像的亮度或彩色图像的颜色矩阵。在matlab的命令窗口中键入&#xff1a; doc imadjust或者help imadjust即可获得该函数的帮助信息&#xff0c; 键入type imadjust可以查看函数的源代码。 函数功能&#xff1…

matlab图像灰度调整——imadjust函数的使用

在MATLAB中&#xff0c;通过函数imadjust&#xff08;&#xff09;进行图像灰度的调整&#xff0c;该函数调用格式如下&#xff1a; Jimadjust( I ) 对图像I进行灰度调整 Jimadjust( I&#xff0c;[low_in;high_in]&#xff0c;[low_out;high_out]) [low_in;high_in]为原图像…

matlab——imadjust函数

作用&#xff1a; 对进行图像的灰度变换&#xff0c;即调节灰度图像的亮度或彩色图像的颜色矩阵。 格式&#xff1a; g imadjust(f,[low_in; high_in],[low_out; high_out]) 将图像I中的亮度值映射到J中的新值。即将low_in至high_in之间的值映射到low_out至high_out之间的值。…

4.3 Python图像处理之图像恢复-无约束滤波器(逆滤波)、有约束滤波器(维纳滤波器)

4.3 Python图像处理之图像恢复-无约束滤波器&#xff08;逆滤波&#xff09;、有约束滤波器&#xff08;维纳滤波器&#xff09; 文章目录 4.3 Python图像处理之图像恢复-无约束滤波器&#xff08;逆滤波&#xff09;、有约束滤波器&#xff08;维纳滤波器&#xff09;1 算法原…

MATLAB图像的恢复

一、实验类型&#xff1a;验证性实验 二、实验目的 1. 掌握退化模型的建立方法。 2. 掌握图像恢复的基本原理。 三、实验设备&#xff1a;安装有MATLAB 软件的计算机 四、实验原理 一幅退化的图像可以近似地用方程gHfn 表示&#xff0c;其中g 为图像&#xff0c;H为变形算…

图像恢复 Restormer: 彻底理解论文和源代码 (注释详尽)

文章目录 1. Restormer 论文2. Restormer 网络结构2.1 整体框架2.2 MDTA2.3 GDFN 3. 主要代码理解3.1 MDTA3.2 GDFN3.3 TransformerBlock3.4 一个测试实例 参考文献结语与思考 1. Restormer 论文 主要工作&#xff1a; [1] MDTA (Multi-Dconv Head Transposed Attention), 聚合…

【去噪去模糊去雨】Multi-Stage Progressive Image Restoration 多阶段渐进式通用图像恢复【CVPR2021】

论文&#xff1a;【CVPR2021】Multi-Stage Progressive Image Restoration 多阶段渐进式通用图像恢复 参考&#xff1a;多阶段渐进式图像恢复 | 去雨、去噪、去模糊 | 有效教程&#xff08;附源码&#xff09;|【CVPR 2021】 1. 研究问题&#xff1a; 图像恢复领域&#xff0c…

图像恢复及滤波处理

图像恢复及滤波处理 1.基本概念&#xff1a; a.图像恢复是通过计算机处理&#xff0c;对质量下降的图像加以重建或恢复的处理过程。因摄像机与物体相对运动、系统误差、畸变、噪声等因素的影响&#xff0c;使图像往往不是真实景物的完善映像。在图像恢复中&#xff0c;需建立造…

CVPR 2020 论文大盘点-图像增强与图像恢复篇

本文继上一篇 CVPR 2020 论文大盘点-去雨去雾去模糊篇 之后,继续盘点CVPR 2020 中低层图像处理技术,本篇聚焦于图像视频的增强与恢复,含如下四个方向: 图像与视频增强(Image&Video Enhancement)7 篇 图像恢复(Image Restoration )5 篇 图像与视频去噪(Image&V…

pytorch: 图像恢复问题的代码实现详解(derain,dehaze,deblur,denoise等通用)

文章目录 前言数据集训练数据集评估数据集测试数据集 网络模型自定义工具包网络训练和测试结语 前言 图像恢复是一类图形去噪问题的集合&#xff0c;在深度学习中可以理解为监督回归问题&#xff0c;主要包括图像去雨、图像去雾、图像去噪&#xff0c;图像去模糊和图像去马赛克…

图像恢复 SWinIR : 彻底理解论文和源代码 (注释详尽)

文章目录 1. SwinIR 论文2. SWinIR 网络结构2.1 整体框架2.2 浅层特征提取2.3 深层特征提取2.4 图像重建模块 3. 主要代码理解3.1 SwinIR3.2 MLP3.3 Patch Embedding3.4 Window Attention3.5 残差 Swin Transformer 块 (RSTB)3.6 HQ Image Reconstruction3.7 一个测试实例 4. 参…

基于张量分解的遥感图像恢复及常用高光谱遥感数据集

本文为初期学习总结&#xff0c;本篇文章总结了遥感高光谱图像研究背景、高光谱图像噪声的分类&#xff0c;介绍了基于张量的图像恢复方法及近年来对于张量分解的相关研究&#xff0c;总结了几个常用的图像评价指标&#xff0c;总结了高光谱遥感图像常用的数据集。仍有很多不足…

【CVPR2021】Multi-Stage Progressive Image Restoration 多阶段渐进式通用图像恢复

首发于jwxie.cn Multi-Stage Progressive Image Restoration &#x1f517; PDF Link &#x1f37a; Github Code Section 1 介绍 图像恢复是一个从低质量的图像恢复出高清图像的任务。典型的低质量因素有噪声&#xff0c;模糊&#xff0c;水滴噪声&#xff0c;雾噪声等。这…

CVPR2022-图像恢复重建Restormer论文解读

CVPR2022文献解读之Restormer 图像恢复重建&#xff1a; Restormer: Efficient Transformer for High-Resolution Image Restoration 原文传送&#xff1a; https://arxiv.org/abs/2111.09881 官方源码&#xff1a;https://github.com/swz30/Restormer 文章目录 CVPR2022文献解…

扩散模型diffusion model用于图像恢复任务详细原理 (去雨,去雾等皆可),附实现代码

文章目录 1. 去噪扩散概率模型2. 前向扩散3. 反向采样3. 图像条件扩散模型4. 可以考虑改进的点5. 实现代码 话不多说&#xff0c;先上代码&#xff1a; 扩散模型diffusion model用于图像恢复完整可运行代码&#xff0c;附详细实验操作流程 令外一篇简化超分扩散模型SR3来实现图…

Matlab维纳滤波图像恢复

点击查看&#xff1a;Matlab维纳滤波图像恢复 文件大小&#xff1a;2.8M 操作系统&#xff1a;Windows10旗舰版 开发工具&#xff1a;Matlab2016、2018、2020 开发语言&#xff1a;.m 简要概述&#xff1a; Matlab维纳滤波图像恢复

图像恢复重建(浙大人工智能导论作业四)

图像恢复重建(浙大人工智能导论作业四) 实验思路代码有很多不完善之处&#xff0c;仅供学习参考 如果同是NKU2021人工智能导论的同学&#xff0c;可以跳过这篇博客&#xff0c;因为会等到实验截止之后笔者才会将实验的具体代码补全。 实验描述&#xff1a; 作业的详细描述移…