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

题目:定义一个图像的对比度拉伸函数,函数名为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.按题目要求显示图像。

 

实现效果:

matlab实现 线性拉伸某灰度图像的对比度 代码 对比度拉伸_第1张图片

实现源代码:

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

 

你可能感兴趣的:(数字图像处理,matlab)