matlab实现 线性拉伸某灰度图像的对比度 代码 对比度拉伸

xiaoxiao2025-10-24  16

题目:定义一个图像的对比度拉伸函数,函数名为myGrayScaleTransform,将输入图像的对比度线性平滑地拉伸到指定的灰度级区间,要求该函数的输入参数包括处理前的灰度图像img1 (如EXP1A.tif)、期望灰度级的参数区间para,输出参数为处理后的灰度图像img2。

定义函数为img2 = myGrayScaleTransform (img1, para),其中,参数para是一个长度为2的一维数组,用于表示期望灰度级区间的最小值和最大值,要求最小和最大值的取值范围限定在区间[0 255]之间,且最小值不能超过最大值,如指定区间为para = [50 120];线性平滑拉伸可以参考数据归一化的计算原理。

 

实现思路:

1.定义函数:

              我们定义的函数有两个参数:图像img1和灰度级区间最小值、最大值的二维数组para。首先对para参数进行判断,若灰度级的最大值和最小值不符合要求则报错。

若输入的参数没有问题,就开始对图像进行处理:先使用im2double函数将uint8类型的图像数据转换为double类型的,分别取图像矩阵的最大值和最小值,使用公式利用公式f=(img – min_i)/(max_i – min_i)把数据范围压缩到0~1之间的数值,即数据的归一化,以便计算。再使用公式img2 = (b - a) .* img2 + a还原图片像素的大小为para区间内的数值,最后使用函数uint8将图片数据转换为uint8的格式,以便输出。

2.测试函数:

使用imread函数读取图像'EXP1A.tif';

分别定义灰度级para = [0,50]、 para = [50,120]、para = [150,250],并分别调用myGrayScaleTransform函数得到对比度拉伸后的图像;

          3.按题目要求显示图像。

 

实现效果:

实现源代码:

clc; %读取图像 img_a = imread('EXP1A.tif'); para = [0,50]; img_a2 = myGrayScaleTransform (img_a, para); para = [50,120]; img_a3 = myGrayScaleTransform (img_a, para); para = [150,250]; img_a4 = myGrayScaleTransform (img_a, para); %显示图像 figure('NumberTitle', 'off', 'Name', '实验一第三题 EXP1A.tif 对比度拉伸'); subplot(2,2,1); imshow(img_a); title('原图'); subplot(2,2,2); imshow(img_a2); title('0~50'); subplot(2,2,3); imshow(img_a3); title('50~120'); subplot(2,2,4); imshow(img_a4); title('150~250'); function img2 = myGrayScaleTransform (img1, para) a = para(1); b = para(2); if(a > b) error('para中参数,最小灰度值a不能超过最大灰度值b!'); elseif(a < 0 || b > 250) error('para中参数,最小灰度值a和最大灰度值b的范围在区间[0,250]之间!'); end img = im2double(img1);%将uint8类型的数据转换为double类型的同时,把数据范围由原来的0~255映射到0~1,可以看作数据的一种归一化,以便计算 min_i = min(img(:)); max_i = max(img(:)); img2 = (img - min_i)./(max_i - min_i);%将图片压缩到0~1之间的数值 img2 = (b - a) .* img2 + a;%还原图片像素的大小为para区间内的数值 img2 = uint8(img2);%将图片数据转换为uint8的格式,以便输出 end

 

转载请注明原文地址: https://www.6miu.com/read-5038465.html

最新回复(0)