MATLAB实现ENVI2%线性拉伸

  • 一. MATLAB实现ENVI线性拉伸
    • 1.参考链接,程序主体来源于:
    • 2.程序修改适用于RGB影像
      • (1)修改内容介绍:
      • (2)程序介绍:
  • 二.matlab在底图上画剖面线
      • 1.在底图上画剖面线
    • 2.底图上的剖面线与底图表示为不同的坐标系

一. MATLAB实现ENVI线性拉伸

1.参考链接,程序主体来源于:

https://blog.csdn.net/u014090429/article/details/106403645

2.程序修改适用于RGB影像

(1)修改内容介绍:

修改1:适用于影像不完全覆盖矩形区域,即存在大量无效值区域的影像。
修改2:ENVI对影像进行线型拉伸,是针对每一波段的影像进行线性拉伸的。(即分别对R,G,B波段进行拉伸)。原程序适用于单波段处理,修改后程序适用于RGB影像。

(2)程序介绍:

程序包含3个函数:
(1)calc_lr_val.m(计算影像的灰度直方图)
(2)img_map.m(将原影像按照2%线性拉伸投射到uint8的影像)
(3)img_strech.m(线性拉伸应用到RGB影像上)
(4)程序使用例子

% ------------------------------------
% 计算直方图左右裁剪的灰度值
% 2015/07/01
%
% Input histcount --> 直方图
% tt --> 图像像素个数
% per --> 左右裁剪的百分比
%
% Output l_val --> 左值
% r_val --> 右值
% ------------------------------------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_ttl_val = i;break;endend% 计算右值tmp = 0;for i = 1:length(histcount)tmp = tmp + histcount(length(histcount)-i+1);if tmp >= per_ttr_val = length(histcount)-i+1;break;endendfprintf(' ... 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');return
% ------------------------------------
% 将图像映射至 [0, 255] 区间
% 2015/07/01
%
% Input img_16bit --> 16位原图像
% l_val --> 映射左值
% r_val --> 映射右值
%
% Output img_8bit --> 输出8位拉伸后图像
% ------------------------------------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');return
function img_matrx_new= img_strech(img_file_name)img_matrix = imread(img_file_name);for i=1:3img=img_matrix(:,:,i);% 这里默认输入图像为单通道[ylen, xlen] = size(img);%     fprintf(' ... Img Xlen: %d pixels\n', xlen);%     fprintf(' ... Img Ylen: %d pixels\n\n\n', ylen);% 线性拉伸max_val = max(img(:));%img(find(img<=1))=nan;min_val = min(img(:));% temp_img=img(:);% min_val = min(temp_img(find(temp_img~=0)));% %b=min(B(find(B~=0)));%     fprintf(' ... ... ... ... ... ... ... ... ... ...\n');%     fprintf(' ... Min Val is %d \n', min_val);%     fprintf(' ... Max Val is %d \n', max_val);%     fprintf(' ... ... ... ... ... ... ... ... ... ...\n\n');% 统计直方图% 输入图像为16位,取值范围为 0 到 65535bins = 0:65535;histcount = histc(img(:)', bins); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%histcount(1) =0; %因为自己使用的影像,有很多nodata_value,但是数值为0,所以加这一步骤%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%清除临时变量 clear bins max_val min_val; % 直方图裁剪,计算左值和右值 [l_val, r_val] = calc_lr_val(histcount, xlen*ylen, 0.02); % 根据左值和右值,将图像由16位映射至8位 img_8bit = img_map(img, l_val, r_val); % 保存结果 img_matrx_new(:,:,i)=img_8bit;%imwrite(img_8bit, 'res_blue.png');end% return (img_matrx_new);end
%RGB影像:band 1,2,3 分别是 R,G,B
img_file_name='E:\2022_5_2_GF_pa1_pa2_lens_rect\pa2_021_010\树高查看\layer_stcak_ms.tif';
img_strech_new= img_strech(img_file_name);
imshow(img_strech_new);

展示结果,目视和envi展示结果一致:

二.matlab在底图上画剖面线

1.在底图上画剖面线

参考链接:https://blog.csdn.net/Enjolras_fuu/article/details/66530196
想要的结果:底图上有两条线,且坐标都在。

我的流程:

fclose all
clear all
clc%RGB影像:band 1,2,3 分别是 R,G,B
img_file_name='E:\2022_5_2_GF_pa1_pa2_lens_rect\pa2_021_010\树高查看\layer_stcak_ms.tif';
img_strech_new= img_strech(img_file_name);
%imshow(img_strech_new);chm_name='E:\2022_5_2_GF_pa1_pa2_lens_rect\pa2_021_010\树高查看\layer_stcak_chm.tif';
img_chm=imread(chm_name);
size_img_chm=size(img_chm);
y_axis_limits=[-50,50];
figure();
hold on
imshow(img_strech_new);hold on
show_y=ones(1,size_img_chm(2))*(ceil(size_img_chm(1)/2))+(-img_chm(ceil(size_img_chm(1)/2),:));
plot(show_y,'r','LineWidth',2);
hold on
plot(ones(1,size_img_chm(2))*(ceil(size_img_chm(1)/2)),'k','LineWidth',1);
%axis xy
hold on
%axis([0 size_img_chm(2) y_axis_limits(1) y_axis_limits(2)]);%限制x轴,y轴的显示范围
axis on
axis([0 size_img_chm(2) 0 size_img_chm(1)]);%限制x轴,y轴的显示范围
hold off

2.底图上的剖面线与底图表示为不同的坐标系

双坐标系参考:https://blog.csdn.net/qq_20481015/article/details/81172140


fig=figure;
%先用imshow画出底图
imshow(img_strech_new);
hold on
%激活左边的坐标系,作为底图,或者是第一个plot的坐标系
yyaxis left
plot(ones(1,size_img_chm(2))*(chm_show_line),'y','LineWidth',1);
hold on
%限制左边坐标系的显示范围
axis([0 size_img_chm(2) 0 size_img_chm(1)]);%限制x轴,y轴的显示范围
axis on%激活右边的坐标系,作为第二个plot的坐标系
yyaxis right
set(gca,'YDir','normal');        %将y轴方向设置为普通(从下到上递增)。
%set(gca,'YDir','reverse');        %将x轴方向设置为反向(从上到下递增)。
show_y=(img_chm(chm_show_line,:)+7);
%show_y=ones(1,size_img_chm(2))*(chm_show_line)+(img_chm(chm_show_line,:)+7);
plot(show_y,'r','LineWidth',2);
hold on
%限制右边坐标系的显示范围
axis([0 size_img_chm(2) -(1-chm_show_line/size_img_chm(1))*100 (chm_show_line/size_img_chm(1))*100]);%限制x轴,y轴的显示范围
axis on

matlab实现ENVI2%线性拉伸及底图上画双坐标系剖面线相关推荐

  1. 用python和matplotlib画双坐标系曲线

    有时候写论文的时候不免会遇到画曲线图,而且还有可能需要画双坐标系(双Y轴)的曲线图,在百度中找了许久,先mark一下,以下代码就是我论文中用到的,以后应该还会用到,先保存在这里.结果图如下: impo ...

  2. matlab中的将几条曲线画在一个坐标系下的方法,请问怎么将几条线画在同一个坐标轴下?有程序!...

    先上程序: num=1; timedata={}; for ID=484:669 conna=database('my','',''); sql=sprintf('select SampleData ...

  3. C# -- 在底图上动态生成文字和图片

    把最近在做的项目的相关知识进行分享,也为以后在用到时可以及时的找到~~ 此篇主要记录在图片上动态的生成需要添加的文字和把指定的图片加到底图上,不多废话,直接上代码 /// <summary> ...

  4. matlab 图像上画椭圆 保持原来图像分辨率

    一. 问题 在真实图像上画椭圆后,保存的图像要不有空白边界要不分辨率大小和原图不一样. 二. 解决方法 利用 figure 的 border 属性 Im2=imread('image\egg.jpg' ...

  5. Matlab运用mapping包在地图上绘制散点图(热力图)

    Matlab运用mapping包在地图上绘制散点图(热力图) 一.前言 Mapping Toolbox是Matlab提供的,一整套包含许多函数跟图形用户界面的工具箱:它可以帮助用户分析几何空间方面的数 ...

  6. 用Matlab将坐标添加到地图上

    用Matlab将坐标添加到地图上 今年本科组全国大学生数学建模国赛我没有参加,闲着无聊帮助研究生学姐做竞赛,她让我用matlab将坐标添加到地图上.我的思路是:先画个地图(地图可以是matlab自带的 ...

  7. matlab实现手绘风格(简笔画风格、漫画风格)的曲线绘图

    matlab实现手绘风格(简笔画风格.漫画风格)的曲线绘图 matlab实现手绘风格(简笔画风格.漫画风格)的曲线绘图 1 网站上的实现方法 2 自己的实现方法 matlab实现手绘风格(简笔画风格. ...

  8. 利用Matlab将图片转换成素描(简笔画)风格

    题目: 利用Matlab将图片转换成素描(简笔画)风格 记得曾经看过别人的网络头像,是那种类似简笔画或素描的图片,一直以来都想做一个类似的头像,但始终不得要领.今天当我看到文献[1]中的图5.28时( ...

  9. matlab小白入门学习(一)画三维图和二维动图

    好久前就打算搞matlab了,但是python实在太香,今天开始呢,就打算更新一个matlab学习的集合 我用的是2018a版,但是都差不多,matlab所有的文件都是.m结尾的,而且语言风格我感觉像 ...

最新文章

  1. 常见浏览器兼容问题、盒模型2种模式以及css hack知识讲解
  2. 平衡查找树C语言程序,树4. Root of AVL Tree-平衡查找树AVL树的实现
  3. oa系统登录后几分钟自动退出_2020版OA办公系统正式上线运行!
  4. POJ 2356 (抽屉原理)
  5. 探测 Lombok 工具
  6. [置顶]       设计模式之结构类模式——桥梁模式
  7. 268G+训练好的word2vec模型(中文词向量)
  8. 视频显示边缘空白的真相
  9. 『TensorFlow』模型保存和载入方法汇总
  10. Golang教程:类型
  11. BP(BackPropagation)神经网络算法详解
  12. TwinCAT 3 首次运行报错4115
  13. 1110_win10专业版官方原版镜像64位
  14. ResHacker 3.5 汉化绿色版
  15. 雅虎邮箱客户端服务器设置
  16. 14.SQL必知必会第15课 插入数据(数据库的备份insert into ... values表的复制操作)
  17. c++自学笔记第五次
  18. 1348:【例4-9】城市公交网建设问题——Kruskal算法
  19. mac字体或windows字体安装到linux,解决linux服务器word文档生成pdf文档出现乱码
  20. keil的debug使用

热门文章

  1. ESP32-S3 master分支开发环境搭建
  2. Ubuntu运行科大讯飞语音模块的tts模块(x_tark机器人源码)
  3. 电影购票APP快速搭建(平台开发)
  4. 《S5PV210三星原厂开发板使用说明+完整原理图》
  5. GOOGLE 全世界
  6. 怎样手动删除系统服务项
  7. win7 启动管理器修改默认启动项
  8. VGA、DVI、HDMI等常见视频接口介绍
  9. Silverlight案例之卷轴动画和Tag树
  10. qt的pushbutton设置样式