Matlab实现遥感图像2%线性拉伸

function outImg = GrayScaleTransform(img)
    [ylen, xlen] = size(img);
    bins = 0:65535;
    histcount = histc(img(:)', bins); 
    %清除临时变量 
    clear bins max_val min_val; 
    % 直方图裁剪,计算左值和右值
    [l_val, r_val] = calc_lr_val(histcount, xlen*ylen, 0.02); 
    % 根据左值和右值,将图像由16位映射至8位 
    outImg = img_map(img, l_val, r_val); 
end


function [img_8bit] = img_map(img_16bit, l_val, r_val)

    [xlen, ylen, c] = size(img_16bit);
    img_8bit = zeros(xlen, ylen);

%     fprintf(' ... ... ... ... ... ... ... ... ...\n');
%     fprintf(' ... IMG MAPPING FROM 16BIT TO 8BIT \n');    
%     fprintf(' ... Img mapping begin ... ... \n');

    % 按照左右值映射
    img_8bit = (img_16bit - l_val).*(255/(r_val-l_val));
    img_8bit = uint8(round(img_8bit));


%     fprintf(' ... Img mapping finshied !!! !!! \n\n');

end

function [l_val, r_val] = calc_lr_val(histcount, tt, per)

%     fprintf(' ... ... ... ... ... ... ... ... ...\n');
%     fprintf(' ... CALC LEFT AND RIGHT VALUE \n');

    per_tt = tt*per;  % 按百分比裁剪的像素个数 

    % 计算左值
    tmp = 0;
    for i = 1:length(histcount)
        tmp = tmp + histcount(i);
        if tmp >= per_tt
            l_val = i;
            break;
        end
    end
    % 计算右值
    tmp = 0;
    for i = 1:length(histcount)
        tmp = tmp + histcount(length(histcount)-i+1);
        if tmp >= per_tt
            r_val = length(histcount)-i+1;
            break;
        end
    end

%     fprintf(' ... Stretch Percentage is %d%%\n', per*100);
%     fprintf(' ... Left Val is %d \n', l_val);
%     fprintf(' ... Right Val is %d \n', r_val);
%     fprintf(' ... ... ... ... ... ... ... ... ...\n\n');

end
### 回答1: 使用Matlab imadjust 函数可以实现对uint16图像进行2%灰度线性拉伸。这是通过指定参数[low_in high_in]、[low_out high_out]来实现的,其中low_in和high_in分别代表输入图像的最低灰度和最高灰度,low_out和high_out分别代表输出图像的最低灰度和最高灰度。 ### 回答2: 对于使用Matlab对uint16图像进行2%灰度线性拉伸,可以按照以下步骤进行操作: 步骤1:导入图像 首先,使用Matlab的imread函数来导入uint16图像。例如,假设图像名为image,你可以使用以下代码来导入图像: image = imread('图像路径'); 步骤2:计算直方图百分比 计算图像的像素值直方图,并找到2%和98%的灰度值。可以使用imhist函数来计算直方图。以下是一个示例代码: [counts, grayLevels] = imhist(image); totalPixels = sum(counts); lowerPercentage = totalPixels * 0.02; upperPercentage = totalPixels * 0.98; lowerValue = find(cumsum(counts) >= lowerPercentage, 1, 'first'); upperValue = find(cumsum(counts) >= upperPercentage, 1, 'first'); 步骤3:灰度线性拉伸 使用Matlab的imadjust函数来进行灰度线性拉伸。以下是一个示例代码: adjustedImage = imadjust(image, [lowerValue/65535, upperValue/65535], [0, 1]); 步骤4:显示结果 最后,使用Matlab的imshow函数来显示结果图像。以下是一个示例代码: imshow(adjustedImage); 这些步骤将对uint16图像进行2%灰度线性拉伸,并使用Matlab显示处理后的图像。请注意,其中的0.02和0.98表示所需的百分比,可以根据需要进行调整。 ### 回答3: 使用MATLAB对uint16图像进行2%灰度线性拉伸的步骤如下: 1. 首先,将图像导入MATLAB环境中。可以使用imread函数读取图像文件,并将其存储为一个uint16的二维数组。 2. 找到图像的最小和最大灰度值。可以使用min和max函数找到图像的最小和最大值。分别保存为变量min_val和max_val。 3. 计算要拉伸的灰度范围。根据2%灰度线性拉伸的要求,计算拉伸后的最小和最大灰度值。最小值为(min_val - 0.02 * (max_val - min_val)), 最大值为(max_val + 0.02 * (max_val - min_val))。 4. 对图像进行线性拉伸。使用MATLAB的imadjust函数,将图像中的灰度值映射到新的范围内。指定最小输入灰度值为min_val,最大输入灰度值为max_val,最小输出灰度值为新的最小值,最大输出灰度值为新的最大值。 5. 显示拉伸后的图像。使用imshow函数显示拉伸后的图像。 下面是一个示例代码,在已经读取了图像文件并将其存储为一个uint16的二维数组img的情况下: ```matlab % 找到最小和最大灰度值 min_val = min(img(:)); max_val = max(img(:)); % 计算灰度范围 stretch_min = min_val - 0.02 * (max_val - min_val); stretch_max = max_val + 0.02 * (max_val - min_val); % 线性拉伸 stretched_img = imadjust(img, [min_val max_val], [stretch_min stretch_max]); % 显示拉伸后的图像 imshow(stretched_img, []); ``` 这样,你就可以对uint16图像进行2%灰度线性拉伸,并显示拉伸后的图像了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉闫小亘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值