zoukankan      html  css  js  c++  java
  • MATLAB 图像处理-线性变换和直方图均衡

    如何在MATLAB中对于已经被表示成数字矩阵的图像进行处理
     

    一、 灰度拉伸变换

      把图像中每个像素点的灰度值,按照希望达到的效果,以线性变化的形式,进行变换。
      如下图,就是一种分段函数形式,把输入的X轴灰度值变换为输出的Y轴灰度值,只是将灰度值做分段线性变换。分段函数控制点(r1,s1)(r2,s2)
     
      创建分段函数:  
    function [ new ] = StretchFunc(original, x1, y1, x2, y2 )
        new = original;
    
        w = size(new, 1);
        h = size(new, 2);
    
        k1 = y1 / x1;
    
        dk1 = (y2 - y1) / (x2 - x1);
        dk2 = (500 - y2) / (500 - x2);
    
        for i = 1 : w
            for j = 1 : h
                x = new(i, j);
                if x < x1
                    new(i, j) = k1 * x;
                elseif x < x2
                    new(i, j) = dk1 * (x - x1) + y1;
                else
                    new(i, j) = dk2 * (x - x2) + y2;
                end
            end
        end
    end
    %读入图片
    O=imread('F:Maths	upian.jpg');
    %进行线性变换,设置转折点为(200,100)和(300,400)
    NO=StretchFunc(O,200,100,300,400);
    %显示原图和变换后的图片
    figure,imshow(O);
    title('原图');
    figure,imshow(NO,[]);
    title('变换后');

    结果图:

    二、直方图均衡

      函数功能,画出图像的直方图,并对图像进行直方图均衡

      直接读图像tupian.jpg,读到O中

      graydis是原始直方图各灰度级像素个数

      原始直方图graydispro,利用原始直方图计算原始累计直方图graydispro

      t[]计算和原始灰度对应的新的灰度t[],建立映射关系,t坐标代表原始的灰度,t[]代表对应原始坐标的新坐标

      new_graydis是统计新直方图各灰度级像素个数

      计算新的灰度直方图new_graydispro,利用新的直方图计算新的累计直方图new_graydispro

      计算直方图均衡后的新图NO

    %读入图片
    O=imread('F:Maths	upian.jpg');
    
    graydis=zeros(1,256);           %设置矩阵大小
    
    graydispro=zeros(1,256);
    
    new_graydis=zeros(1,256);
    
    new_graydispro=zeros(1,256);
    
    [h w]=size(O);
    
    NO=zeros(h,w);
    
    %计算原始直方图各灰度级像素个数graydis
    
    for x=1:h
    
         for y=1:w
    
             graydis(1,O(x,y))=graydis(1,O(x,y))+1;
    
         end
    
    end
    
    %计算原始直方图graydispro
    
    graydispro=graydis./sum(graydis);
    
    subplot(1,2,1);
    
    plot(graydispro);
    
    title('灰度直方图');
    
    xlabel('灰度值');ylabel('像素的概率密度');
    
    %计算原始累计直方图
    
    for i=2:256
    
        graydispro(1,i)=graydispro(1,i)+graydispro(1,i-1);
    
    end
    
    %计算和原始灰度对应的新的灰度t[],建立映射关系
    
    for i=1:256
    
    t(1,i)=floor(254*graydispro(1,i)+0.5);
    
    end
    
    %统计新直方图各灰度级像素个数new_graydis
    
    for i=1:256
    
        new_graydis(1,t(1,i)+1)=new_graydis(1,t(1,i)+1)+graydis(1,i);
    
    end
    
    %计算新的灰度直方图new_graydispro
    
    new_graydispro=new_graydis./sum(new_graydis);
    
    subplot(1,2,2);
    
    plot(new_graydispro);
    
    title('均衡化后的灰度直方图');
    
    xlabel('灰度值');ylabel('像素的概率密度');
    
    %计算直方图均衡后的新图NO
    
    for x=1:h
    
        for y=1:w
    
          NO(x,y)=t(1,O(x,y));
    
        end
    
    end
    
    figure,imshow(O);
    
    title('原图');
    
    figure,imshow(NO,[]);
    
    title('直方图均衡化后的图');

      结果:

     
     
     
     
  • 相关阅读:
    【动画】看动画轻松理解「Trie树」
    浅析HTTP/2的多路复用
    HTTPS 详解
    PHP写时复制(Copy On Write)
    golang 几种字符串的拼接方式
    正排索引和倒排索引简单介绍
    传值还是传引用
    lvs与nginx区别
    Docker运行操作系统环境(BusyBox&Alpine&Debian/Ubuntu&CentOS/Fedora)
    原创-thanos组件(聚合多个prometheus组件)原理介绍
  • 原文地址:https://www.cnblogs.com/tianzhenyun/p/5022652.html
Copyright © 2011-2022 走看看