zoukankan      html  css  js  c++  java
  • matlab练习程序(直方图匹配)

      直方图匹配或叫做直方图规定化都可以,是把原图像的直方图按照给定的直方图加以映射,使新图像的直方图的分布类似于给定的函数。

      总共有以下几步:

      1.求给定的函数的累积直方图s。

      2.求原图像的累积直方图G。

      3.求s中每一个值在G中距离最小的位置index。

      4.求原图像每个像素通过index映射到的新像素的值。

    代码如下:

    clear all;
    close all;
    clc;
    
    r=127;                              
    x=-r:r+1;
    sigma=20;
    y1=exp(-((x-80).^2)/(2*sigma^2));
    y2=exp(-((x+80).^2)/(2*sigma^2));
    y=y1+y2;                        %双峰高斯函数,任意函数都可以
    
    %im=imread('bg.bmp');  %匹配一个图像的直方图
    %y=imhist(im);
    y=y/sum(y);         %归一化,使函数符合概率分布的sum(y)==1这样一个规律
    plot(y);            %待匹配的直方图
    
    G=[];               %函数的累积直方图
    for i=1:256
       G=[G sum(y(1:i))]; 
    end
    
    img=imread('lena.jpg');
    [m n]=size(img);
    hist=imhist(img);       %待处理图像的直方图
    p=hist/(m*n);           
    figure;plot(p)          %原图直方图
    
    s=[];                   %待处理图像的累积直方图
    for i=1:256
        s=[s sum(p(1:i))];
    end
    
    for i=1:256
        tmp{i}=G-s(i);
        tmp{i}=abs(tmp{i});         %因为要找距离最近的点,所以取绝对值
        [a index(i)]=min(tmp{i});   %找到两个累积直方图距离最近的点
    end
    
    imgn=zeros(m,n);
    for i=1:m
       for j=1:n
          imgn(i,j)=index(img(i,j)+1)-1;    %由原图的灰度通过索引映射到新的灰度
       end
    end
    
    imgn=uint8(imgn);
    figure;imshow(imgn)
    figure;plot(imhist(imgn))       %新图的直方图

    效果如下:

    给定的直方图

    原图

    原图直方图

    变换后的直方图

    最后的结果

  • 相关阅读:
    random、shutil、shevle、标准输入输出错误流
    Python中Json 和 pickle 详解
    Python 中的sys、os、os.path模块总结
    Python 中time,calendar,datatime模块总结
    包的概念和导入包的方法
    Python 中模块及其导入方式
    迭代器和生成器
    python 函数参数
    JAVA 配置Path环境变量
    腾讯云服务器简单配置web项目
  • 原文地址:https://www.cnblogs.com/tiandsp/p/2825418.html
Copyright © 2011-2022 走看看