精华内容
下载资源
问答
  • 为了提高光电成像系统对目标的探测识别能力, 提出了一种彩色偏振成像的目标-背景对比度增强方法。基于菲涅耳原理, 分析了目标偏振度随入射光波长的变化规律; 采集不同偏振片旋转角度下的彩色偏振图像, 从中分离出红...
  • 一种基因芯片图像的对比度增强方法.pdf
  • 针对该问题,提出了一种基于图像重建的同步辐射CT图像对比度增强方法。首先基于滤波反投影(FBP)重建算法和联合代数迭代重建技术(SART)算法分别重建图像,得到两种重建算法的重建数值区间范围,然后将FBP的数值区间映射...
  • 在分析了直方图均衡化、规定化和局部对比度增强三种图像增强方法的基础上,将直方图规定化和局部对比度增强方法相结合,对X线医学图像进行增强处理.实验结果表明该方法的增强效果优于直方图均衡化、规定化处理方法...
  • 提出了一种基于Lee滤波器和柔性形态学医学超声图像局部对比度增强方法. 在研究中首先根据医学超声图像的局部统计特性使用Lee滤波器对其进行预处理, 然后用柔性形态学的tophat变换从递归开运算后图像中提取亮特征用于...
  • 针对传统红外图像动态范围压缩和对比度增强方法对原始图像信息保留不足的缺点,提出了一种基于最优映射曲线的红外图像动态范围压缩和对比度增强方法。利用自适应高斯核函数卷积原始红外图像的直方图,用平滑后直方图...
  • 电子政务-一种直下式白光LED背光源液晶电视对比度增强方法.zip
  • 行业分类-物理装置-X光图像局部对比度增强方法及终端.zip
  • 通过使用论文“Efficient Contrast Enhancement Using Adaptive Gamma Correction With Weighting Distribution”来增强图像的对比度。 您可以在以下位置下载: ...
  • 20180306站位
    20180306站位
    展开全文
  • 数字图像的模糊增强方法【模糊对比度增强
  • 传统的图像对比度增强技术容易造成图像的局部区域过分增强或增强不足等问题, 因此提出了一种结合不可分小波分析和曲线拟合的图像对比度增强方法。该方法以标准清晰图像的均值和标准差作为图像对比度增强的理想目标, ...
  • VHDL 实现的图像增强,利用对比度增强方法
  • 对比度增强

    2018-06-06 19:55:06
    OPENCV图像处理对比度增强,代码简单实现了对比度增强
  • 针对传统对比度增强算法对图像增强的不足,提出一种基于形态滤波重构原图像的对比度增强方法。该方法使用多尺度top-hat变换提取图像多尺度下的亮、暗细节特征,并根据多尺度下局部细节特征的重要性,利用非线性函数对...
  • 如果你想增强对比度使用这个
  • 主要介绍了Python 图像对比度增强的几种方法(小结),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • matlab对比度增强源代码,对比度增强是将图像中的亮度值范围拉伸或压缩成显示系统指定的亮度显示范围,从而提高图像全部或局部的对比度。输入图像中的每个亮度值通过一定的转换函数,对应于输出图像的一个显示值。
  • Python 图像对比度增强的几种方法

    千次阅读 2019-09-19 11:31:26
    Python 图像对比度增强的几种方法图像处理工具——灰度直方图 图像处理工具——灰度直方图 灰度直方图时图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。 例子: I={abcdefghijklmnopqrst}I...


    图像处理工具——灰度直方图

    灰度直方图时图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数或者占有率。
    例子:矩阵
    I = { 10 15 55 145 15 10 10 55 1 12 10 145 90 180 0 125 } I= \left\{ \begin{matrix} 10 & 15 & 55 & 145 \\ 15 & 10 & 10 & 55 \\ 1 & 12 & 10 & 145 \\ 90 & 180 & 0 & 125 \end{matrix} \right\} I=1015190151012180551010014555145125
    图片来自网络,侵删!
    来自网络
    上面图片的灰度直方图
    在这里插入图片描述

    python实现

    #!usr/bin/env python
    #-*- coding:utf-8 _*-
    """
    @author:Sui yue
    @describe: 灰度直方图,描述每个灰度级在图像矩阵中的像素个数或者占有率
    @time: 2019/09/15
    """
    
    import  sys
    import cv2
    import numpy as np
    import  matplotlib.pyplot as plt
    
    #对于8位图,图像的灰度级范围式0~255之间的整数,通过定义函数来计算直方图
    def calcGrayHist(image):
        #灰度图像矩阵的高、宽
        rows, cols = image.shape
        #存储灰度直方图
        grayHist=np.zeros([256],np.uint64)
        for r in range(rows):
            for c in range(cols):
                grayHist[image[r][c]] +=1
        return grayHist
    #主函数
    if __name__=="__main__":
        #第一个参数式图片地址,你只需放上你的图片就可
        image = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE)
        cv2.imshow("image", image)
        print("Usge:python histogram.py imageFile")
        #计算灰度直方图
        grayHist=calcGrayHist(image)
        #画出灰度直方图
        x_range=range(256)
        plt.plot(x_range,grayHist,'r',linewidth=2,c='black')
        #设置坐标轴的范围
        y_maxValue=np.max(grayHist)
        plt.axis([0,255,0,y_maxValue])
        plt.ylabel('gray level')
        plt.ylabel("number or pixels")
        # 显示灰度直方图
        plt.show()
        cv2.waitKeyEx(0)
    

    结果

    在这里插入图片描述


    线性变换

    假设输入图像为I,宽W、高为H,输出图像为O,图像的线性变换可以利用以下公式:
    O ( r , c ) = a ∗ I ( r , c ) + b , 0 ≤ r < H , 0 ≤ c < W O(r,c)=a*I(r,c)+b,\quad0\le r \lt H,0\le c \lt W O(r,c)=aI(r,c)+b,0r<H,0c<W
    a的改变影响图像的对比度,b的改变影响图像的亮度

    线性变换python实现

    #!usr/bin/env python3
    #-*- coding:utf-8 -*-
    #--------------------------
    """
    @author:Sui yue
    @describe: 对比增强,线性变换
    @time: 2019/09/15 14:21:44
    """
    import sys
    import numpy as np
    import cv2
    import  matplotlib.pyplot as plt
    #主函数
    
    def calcGrayHist(image):
        #灰度图像矩阵的高、宽
        rows, cols = image.shape
        #存储灰度直方图
        grayHist=np.zeros([256],np.uint64)
        for r in range(rows):
            for c in range(cols):
                grayHist[image[r][c]] +=1
                # 显示灰度直方图
        # 画出灰度直方图
        x_range = range(256)
        plt.plot(x_range, grayHist, 'r', linewidth=2, c='black')
        # 设置坐标轴的范围
        y_maxValue = np.max(grayHist)
        plt.axis([0, 255, 0, y_maxValue])
        plt.ylabel('gray level')
        plt.ylabel("number or pixels")
        # 显示灰度直方图
        plt.show()
    
    if __name__=="__main__":
        # 读图像
        I = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE)
        #线性变换
        a=3
        O=float(a)*I
        #进行数据截断,大于255 的值要截断为255
        O[0>255]=255
        #数据类型转换
        O=np.round(O)
        #uint8类型
        O=O.astype(np.uint8)
        #显示原图和线性变换后的效果
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        calcGrayHist(I)
        calcGrayHist(O)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    线性变换结果

    在这里插入图片描述
    灰度直方图
    在这里插入图片描述


    直方图正规化

    假设输入图像为I,宽W、高为H I ( r , c ) I(r,c) Ir,c代表I的第r行第c列的灰度值,将I中出现的最小灰度级记为 I m i n I_{min} Imin,最大灰度级记为 I m a x I_{max} Imax, I ( r , c ) ∈ [ I m i n , I m a x ] I(r,c)\in [I_{min},I_{max}] Ir,c[Imin,Imax],为使输出图像O的灰度级范围为 [ O m i n , O m a x ] [O_{min},O_{max}] [Omin,Omax], I ( r , c ) I(r,c) Ir,c O ( r , c ) O(r,c) Or,c做以下映射关系:
    O ( r , c ) = O m i n , O m a x I m i n , I m a x ( I ( r , c ) − I m i n ) + O m a x O(r,c)=\frac{O_{min},O_{max}}{I_{min},I_{max}}(I(r,c)-I_{min})+O_{max} O(r,c)=Imin,ImaxOmin,Omax(I(r,c)Imin)+Omax
    其中 0 ≤ r < H , 0 ≤ c < W \quad0\le r \lt H,0\le c \lt W 0r<H,0c<W, O ( r , c ) O(r,c) O(r,c)代表O的第r行和第c列的灰度值。这个过程就是常称的直方图正规化。因为 0 ≤ I ( r , c ) − I m i n I m a x − I m i n ≤ 1 0 \le\frac{I(r,c)-I_{min}}{I_{max}-I_{min}} \le 1 0ImaxIminI(r,c)Imin1,所以 O ( r , c ) ∈ [ O m i n , O m a x ] O(r,c) \in [O_{min},O_{max}] O(r,c)[Omin,Omax],一般令 O m i n = 0 O_{min}=0 Omin=0, O m a x = 255 O_{max}=255 Omax=255。显然,直方图正规化使一种自动选取a和b的值的线性变换方法,其中
    a = O m a x − O m i n I m a x , I m i n , b = O m i n − O m a x − O m i n I m a x − I m i n ∗ I m i n a=\frac{O_{max}-O_{min}}{I_{max},I_{min}},b=O_{min}-\frac{O_{max}-O_{min}}{I_{max}-I_{min}}*I_{min} a=Imax,IminOmaxOmin,b=OminImaxIminOmaxOminImin

    直方图正规化python实现

    #!usr/bin/env python3
    #-*- coding:utf-8 -*-
    #--------------------------
    """
    @author:Sui yue
    @describe: 直方图正规化
    @time: 2019/09/18 21:17:22
    """
    
    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    import sys
    
    def calcGrayHist(image):
        #灰度图像矩阵的高、宽
        rows, cols = image.shape
        #存储灰度直方图
        grayHist=np.zeros([256],np.uint64)
        for r in range(rows):
            for c in range(cols):
                grayHist[image[r][c]] +=1
                # 显示灰度直方图
        # 画出灰度直方图
        x_range = range(256)
        plt.plot(x_range, grayHist, 'r', linewidth=2, c='black')
        # 设置坐标轴的范围
        y_maxValue = np.max(grayHist)
        plt.axis([0, 255, 0, y_maxValue])
        plt.ylabel('gray level')
        plt.ylabel("number or pixels")
        # 显示灰度直方图
        plt.show()
    #主函数
    if __name__ == '__main__':
        #读入图像
        I = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE)
        #求I的最大值,最小值
        Imax=np.max(I)
        Imin=np.min(I)
        #要输出的最小灰度级和最大灰度级
        Omax,Omin=255,0
        #计算a和b的值 ,测试出*4 能看到人脸
        a=float(Omax-Omin)/(Imax-Imin)
        b=Omin-a*Imin
        #矩阵的线性变换
        O=a*I+b
        #数据类型转换
        O=O.astype(np.uint8)
        #显示原图和直方图正规化的效果
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        calcGrayHist(O)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    直方图正规化结果

    在这里插入图片描述
    在这里插入图片描述


    伽马变换

    假设输入图像为I,宽W、高为H,首先将其灰度值归一化到 [ 0 , 1 ] [0,1] [0,1]范围,对于8位图来说,除以255即可。 I ( r , c ) I(r,c) I(r,c)代表归一化后的第r行第c列的灰度值,为使输出图像O ,伽马变换就是令 O ( r , c ) = I ( r , c ) γ , 0 ≤ r < H , 0 ≤ c < W O(r,c)=I(r,c)^\gamma,\quad0\le r \lt H,0\le c \lt W O(r,c)=I(r,c)γ,0r<H,0c<W,如下图所示:
    来自网络
    γ = 1 \gamma=1 γ=1时,图像不变。如果图像整体或者感兴趣区域较暗,则令 0 ≤ γ < 1 0\le \gamma \lt 1 0γ<1可以增加图像对比度;相反图像整体或者感兴趣区域较亮,则令 γ > 1 \gamma \gt 1 γ>1可以降低图像对比度。

    伽马变换python实现

    #!usr/bin/env python3
    #-*- coding:utf-8 -*-
    #--------------------------
    """
    @author:Sui yue
    @describe: 对比增强 伽马变换
    @time: 2019/09/18 22:22:51
    """
    import cv2
    import numpy as np
    import sys
    #主函数
    if __name__ == '__main__':
        I = cv2.imread('../images/test3.jpg', cv2.IMREAD_GRAYSCALE)
        #图像归一化
        fI=I/255.0
        #伽马变换
        gamma=0.3
        O=np.power(fI,gamma)
        #显示原图和伽马变换
        cv2.imshow("I",I)
        cv2.imshow("O",O)
        cv2.waitKey()
        cv2.destroyAllWindows()
    

    伽马变换结果

    gamma=0.3

    展开全文
  • 此功能允许设置全局图像强度阈值,从而导致对比度增强(按颜色量化的价格)。 这是一种原始的图像判别方式元素基于它们的颜色 - 增加一些,减少其他,根据它们与阈值的关系。 该贡献还包括一个包含此功能的小型 GUI...
  • 数字图像处理,经典对比度增强算法

    万次阅读 多人点赞 2014-07-28 20:24:50
     图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大...

    关于图像增强必须清楚的基本概念

    1.图像增强的目的:

    1)改善图像的视觉效果,
    2)转换为更适合于人或机器分析处理的形式
    3)突出对人或机器分析有意义的信息
    4)抑制无用信息,提高图像的使用价值
    5)增强后的图像并不一定保真


    2,图像增强的方法分类:

    1)从处理对象分类:灰度图像,(伪)彩色图像
    2)从处理策略分类:全局处理,局部处理(ROI ROI,Region of Interest Interest)
    3)从处理方法分类:空间域(点域运算,即灰度变换;邻域方法,即空域滤波),频域方法
    4)从处理目的分类:图像锐化,平滑去噪,灰度调整(对比度增强)


    3,图像增强的方法之对比度增强

    1)灰度变换法

    线性变换(已实现)
    对数变换(已实现)
    指数变换(已实现)

    2)直方图调整法
    直方图均衡化(已实现)
    直方图匹配(未实现)



    一,直方图均衡化 

    直方图均衡化的英文名称是Histogram Equalization. 

      图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
      直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
      缺点: 
      1)变换后图像的灰度级减少,某些细节消失; 
      2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。 
      直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。 
      这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
      这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景杂讯的对比度并且降低有用信号的对比度。
      

    关于编程实现,同样是不调用matlab库函数,自己编程实现。这样可以更深刻地理解直方图均衡化技术,提高编程能力。

    实现代码(matlab):


    clc;
    close all;
    clear all;
     
    src_img = imread('flyman_gray.bmp');  
    
    figure (1) 
    subplot(321),imshow(src_img),title('原图像');%显示原始图像  
    subplot(322),imhist(src_img),title('原图像直方图');%显示原始图像直方图  
    
    matlab_eq=histeq(src_img);         %利用matlab的函数直方图均衡化
    subplot(323),imshow(matlab_eq),title('matlab直方图均衡化原图像');%显示原始图像  
    subplot(324),imhist(matlab_eq),title('matlab均衡化后的直方图');%显示原始图像直方图 
    
    dst_img=myHE(src_img);             %利用自己写的函数直方图均衡化
    subplot(325),imshow(dst_img),title('手写均衡化效果');%显示原始图像  
    subplot(326),imhist(dst_img),title('手写均衡化直方图');%显示原始图像直方图 

    直方图均衡化函数的实现:


    function dst_img=myHE(src_img)  
    
    [height,width] = size(src_img);
    dst_img=uint8(zeros(height,width));
    %进行像素灰度统计;    
    NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级    
    for i = 1:height    
        for j = 1: width    
            NumPixel(src_img(i,j) + 1) = NumPixel(src_img(i,j) + 1) + 1;%对应灰度值像素点数量增加一    
        end    
    end    
    %计算灰度分布密度    
    ProbPixel = zeros(1,256);    
    for i = 1:256    
        ProbPixel(i) = NumPixel(i) / (height * width * 1.0);    
    end    
    %计算累计直方图分布    
    CumuPixel = zeros(1,256);    
    for i = 1:256    
        if i == 1    
            CumuPixel(i) = ProbPixel(i);    
        else    
            CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);    
        end    
    end    
      
    % 指定范围进行均衡化  
    % pixel_max=max(max(I));  
    % pixel_min=min(min(I));  
    pixel_max=255;  
    pixel_min=0;  
    %对灰度值进行映射(均衡化)    
    for i = 1:height    
        for j = 1: width    
            dst_img(i,j) = CumuPixel(src_img(i,j)+1)*(pixel_max-pixel_min)+pixel_min;    
        end    
    end    
    return;



    为什们和matlab的直方图不一样呢???



    二,指数变换

    指数变换(Power-Law )的公式:S=c*R^r, 通过合理的选择c和r可以压缩灰度范围,算法以c=1.0/255.0, r=2实现。
    要做该图像增强变换需要先做归一化,再指数变换,最后反归一化
    增强效果展示:可以看见,改增强算法并不能很好的将像素尽可能的碾平。
    指数增强参考程序为:
    clc;
    close all;
    clear all; 
       
    % -------------Gamma Transformations-----------------  
    %f = imread('Fig0316(4)(bottom_left).tif');   
    f = imread('seed.tif');   
    Gamma = 0.4;  
    g2 = myExpEnhance(f,Gamma);  
    
    figure();  
    subplot(221);  imshow(f);  xlabel('a).Original Image');  
    subplot(222),imhist(f),title('原图像直方图');%显示原始图像直方图  
    subplot(223);  imshow(g2);  xlabel('b).Gamma Transformations \gamma = 0.4');  
    subplot(224),imhist(g2),title('增强图像直方图');%显示原始图像直方图 
    指数增强核心函数为:
    function dst_img=myExpEnhance(src_img,Gamma)  
    src_img = mat2gray(src_img,[0 255]);%将图像矩阵A中介于amin和amax的数据归一化处理, 其余小于amin的元素都变为0, 大于amax的元素都变为1。  
    C = 1;  
    g2 = C*(src_img.^Gamma); 
    %反归一化
    max=255;
    min=0;
    dst_img=uint8(g2*(max-min)+min);




    三,对数变换

           对数变换主要用于将图像的低灰度值部分扩展,将其高灰度值部分压缩,以达到强调图像低灰度部分的目的。变换方法由下式给出。

    这里的对数变换,底数为(v+1),实际计算的时候,需要用换底公式。其输入范围为归一化的【0-1】,其输出也为【0-1】。对于不同的底数,其对应的变换曲线如下图所示。

    底数越大,对低灰度部分的强调就越强,对高灰度部分的压缩也就越强。相反的,如果想强调高灰度部分,则用反对数函数就可以了。看下面的实验就可以很直观的理解,下图是某图像的二维傅里叶变换图像,其为了使其灰度部分较为明显,一般都会使用灰度变换处理一下。

    效果图:


    参考代码:
    clc;
    close all;
    clear all; 
    
    %-------------Log Transformations-----------------
    f = imread('seed.tif');
    
    g_1 = myLogEnhance(f,10);
    g_2 = myLogEnhance(f,100);
    g_3 = myLogEnhance(f,200);
    
    figure();
    subplot(2,2,1);
    imshow(f);xlabel('a).Original Image');
    
    subplot(2,2,2);
    imshow(g_1);xlabel('b).Log Transformations v=10');
    
    subplot(2,2,3);
    imshow(g_2);xlabel('c).Log Transformations v=100');
    
    subplot(2,2,4);
    imshow(g_3);
    xlabel('d).Log Transformations v=200');

    对数变换核心函数
    function dst_img=myLogEnhance(src_img,v) 
    c=1.0;
    src_img = mat2gray(src_img,[0 255]);
    g =c*log2(1 + v*src_img)/log2(v+1);
    %反归一化
    max=255;
    min=0;
    dst_img=uint8(g*(max-min)+min);





    四,灰度拉伸

    灰度拉伸也用于强调图像的某个部分,与伽马变换与对数变换不同的是,灰度拉升可以改善图像的动态范围。可以将原来低对比度的图像拉伸为高对比度图像。实现灰度拉升的方法很多,其中最简单的一种就是线性拉伸。而这里介绍的方法稍微复杂一些。灰度拉伸所用数学式如下所示。

    同样的,其输入r为【0-1】,其输出s也为【0-1】。这个式子再熟悉不过了,跟巴特沃斯高通滤波器像极了,其输入输出关系也大致能猜到是个什么形状的。但是,这里就出现一个问题了,输入为0时候,式子无意义了。所以,在用Matlab计算的时候,将其变为如下形式。

    这里的eps,就是Matlab里面,一个很小数。如此做的话,式子变得有意义了。但是,其输入范围为【0-1】的时候,其输出范围变为了。输出范围大致为【0-1】,为了精确起见,使用mat2gray函数将其归一化到精确的[0-1]。调用格式如下。



    五,线性拉伸

    为了突出感兴趣的目标或者灰度区间,相对抑制那些不感兴趣的灰度区域,可采用分段线性法,常用的是三段线性变换




    参考程序:

    clc;
    close all;
    clear all; 
    
    I=imread('seed.tif'); 
    [m,n,k]=size(I);
    figure (1)
    imshow('seed.tif');title(' 原图像'); 
    mid=mean(mean(I));
    %横轴
    fa=20; fb=80;
    %纵轴
    ga=50; gb=230;
    
    J=myLinearEnhance(I,fa,fb,ga,gb);
    figure (2)
    imshow(J);title(' 线性拉伸图像'); 
    
    pixel_f=1:256;
    pixel_g=zeros(1,256);
    
    %三段斜率,小于1表示该段将会被收缩
    k1=double(ga/fa); 
    k2=(gb- ga)/(fb- fa);
    k3=(256- gb)/(256- fb);
    for i=1:256
        if i <= fa
            pixel_g(i)= k1*i;
        elseif fa < i && i <= fb
            pixel_g(i)= k2*( i- fa)+ ga;
        else
            pixel_g(i)= k3*( i - fb)+ gb;
        end
    end
    figure (3)
    plot(pixel_f,pixel_g);


    核心函数:

    function dst_img=myLinearEnhance(src_img,fa,fb,ga,gb)  
    
    [height,width] = size(src_img);
    dst_img=uint8(zeros(height,width));
    
    src_img=double(src_img);
    
    %三段斜率
    k1=ga/fa; 
    k2=(gb- ga)/(fb- fa);
    k3=(255- gb)/(255- fb);
    for i=1:height
        for j=1:width
                if src_img(i,j) <= fa
                    dst_img(i,j)= k1*src_img(i,j);
                elseif fa < src_img(i,j) && src_img(i,j) <= fb
                    dst_img(i,j)= k2*( src_img(i,j)- fa)+ ga;
                else
                    dst_img(i,j)= k3*( src_img(i,j)- fb)+ gb;
                end
        end
    end
    dst_img=uint8(dst_img); 




    附录:

    附录网上的另一份讲解:
    直方图均衡化算法分为三个步骤,第一步是统计直方图每个灰度级出现的次数,第二步是累计归一化的直方图,第三步是计算新的像素值。
    第一步:
    for(i=0;i<height;i++)
    for(j=0;j<width;j++)
    n[s[i][j]]++;

    for(i=0;i<L;i++)
    p[i]=n[i]/(width*height);

    这里,n[i]表示的是灰度级为i的像素的个数,L表示的是最大灰度级,width和height分别表示的是原始图像的宽度和高度,所以,p[i]表示的就是灰度级为i的像素在整幅图像中出现的概率(其实就是p[]这个数组存储的就是这幅图像的归一化之后的直方图)。
    第二步:
    for(i=0;i<=L;i++)
    for(j=0;j<=i;j++)
    c[i]+=p[j];

    c[]这个数组存储的就是累计的归一化直方图。
    第三步:
    max=min=s[0][0];
    for(i=0;i<height;i++)
    for(j=0;j<width;j++)
    if(max<s[i][j]){
    max=s[i][j];
    }else if(min>s[i][j]){
    min=s[i][j];
    }

    找出像素的最大值和最小值。
    for(i=0;i<height;i++)
    for(j=0;j<width;j++)
    t[i][j]=c[s[i][j]]*(max-min)+min;

    t[][]就是最终直方图均衡化之后的结果。


    收录优秀代码:

    这份代码写得不错,学习了,原博客地址见参考资源【3】!

    #include <stdio.h>
    #include <iostream>
    #include "fftw3.h"
    #include "string"
    #include "vector"
    #include <windows.h>
    #include <opencv2/legacy/legacy.hpp>
    #include <opencv2/nonfree/nonfree.hpp>//opencv_nonfree模块:包含一些拥有专利的算法,如SIFT、SURF函数源码。 
    #include "opencv2/core/core.hpp"
    #include "opencv2/features2d/features2d.hpp"
    #include "opencv2/highgui/highgui.hpp"
    #include <opencv2/nonfree/features2d.hpp>
    
    using namespace cv;
    using namespace std;
    
    class hisEqt
    {
    public:
    	hisEqt::hisEqt();
    	hisEqt::~hisEqt();
    public:
    	int w;
    	int h;
    	int nlen;
    
    	int *pHis;
    	float *pdf;
    
    	//=====求像素分布概率密度====  
    	void  getPdf();
    
    	//======统计像素个数=======  
    	void getHis(unsigned char*imgdata);
    
    	//==========画统计分布直方图===============  
    	void drawHistogram(const float*pdf,Mat &hist1);  
    
    	//===========直方图均衡化==========  
    	void hisBal();
    
    	//====直方图均衡化后的图像===  
    	void imgBal(unsigned char* img);
    };
    
    
    hisEqt::hisEqt() :nlen(0){
    	pHis = new int[256 * sizeof(int)];
    	memset(pHis, 0, 256 * sizeof(int));
    	pdf = new float[255 * sizeof(float)];
    	memset(pdf, 0, 255 * sizeof(float));
    }
    
    hisEqt::~hisEqt(){
    	delete[]pHis;
    	delete[]pdf;
    }
    
    
    //======统计像素个数=======  
    void hisEqt::getHis(unsigned char*imgdata){
    	for (int i = 0; i<nlen; i++)
    	{
    		pHis[imgdata[i]]++;
    	}
    }
    
    
    //=====求像素分布概率密度====  
    void hisEqt::getPdf(){
    	for (int k = 0; k<256; k++)
    	{
    		pdf[k] = pHis[k] / float(nlen);
    	}
    }
    
    //===========直方图均衡化==========  
    void hisEqt::hisBal(){
    	for (int k = 1; k<256; k++)
    	{
    		pdf[k] += pdf[k - 1];
    	}
    	for (int k = 0; k<256; k++)
    	{
    		pHis[k] = 255 * pdf[k];
    	}
    }
    
    //====直方图均衡化  
    void hisEqt::imgBal(unsigned char* img){
    	for (int i = 0; i<nlen; i++)
    	{
    		img[i] = pHis[img[i]];
    	}
    }
    
    
    void hisEqt::drawHistogram(const float *pdf, Mat& hist1){
    	for (int k = 0; k<256; k++)
    	{
    		if (k % 2 == 0)
    		{
    			Point a(k, 255), b(k, 255 - pdf[k] * 2550);
    			line(hist1,
    				a,
    				b,
    				Scalar(0, 0, 255),
    				1);
    		}
    		else
    		{
    			Point a(k, 255), b(k, 255 - pdf[k] * 2550);
    			line(hist1,
    				a,
    				b,
    				Scalar(0, 255, 0),
    				1);
    		}
    	}
    }
    
    
    int main()
    {
    	Mat image = imread("Fig0651(a)(flower_no_compression).tif");
    	if (!image.data)
    		return -1;
    
    	Mat hist2(256, 256, CV_8UC3, Scalar(0, 0, 0));
    	Mat hist1(256, 256, CV_8UC3, Scalar(0, 0, 0));
    
    	Mat imgOut = Mat(image.rows, image.cols, CV_8UC3, Scalar(0, 0, 0));
    	vector<Mat> planes;
    	int chn = image.channels();
    	if (chn == 3)
    	{
    		split(image, planes);
    	}
    	while (chn)
    	{
    		chn--;
    		unsigned char* imageData = new unsigned char[sizeof(unsigned char)*(image.cols*image.rows)];
    		memcpy(imageData, planes[chn].data, planes[chn].cols*planes[chn].rows);
    		hisEqt his;//自定义的类
    		his.nlen = image.rows*image.cols;
    		his.getHis(imageData);
    		his.getPdf();
    
    		//  //======画原图直方图并保存============  
    		his.drawHistogram(his.pdf, hist1);
    		string pic_name = "hisline";
    		pic_name = pic_name + to_string(chn);
    		pic_name=pic_name+	".jpg";
    		imwrite(pic_name, hist1);
    
    		his.hisBal();
    		his.getPdf();
    		//  //======画均衡化后直方图并保存============  
    		his.drawHistogram(his.pdf, hist2);
    		string pic_name0 = "his_balanceline";
    		pic_name0 = pic_name0 + to_string(chn);
    		pic_name0 = pic_name0 + ".jpg";
    		imwrite(pic_name0, hist2);
    
    		//  //=====图像均衡化===  
    		his.imgBal(imageData);
    		memcpy(planes[chn].data, imageData, planes[chn].cols*planes[chn].rows);
    		delete[] imageData;
    		imageData = NULL;
    	}
    	merge(planes, imgOut);//单通道合并
    	imwrite("result.jpg", imgOut);
    	return 0;
    }



    参考资源

    【1】http://blog.csdn.net/xiajun07061225/article/details/6910129

    【2】数字图像处理,冈萨雷斯著

    【3】http://blog.csdn.net/bettyshasha/article/details/46940805

    【4】http://blog.csdn.net/terryzero/article/details/6043821

    【5】http://www.myexception.cn/image/1450848.html

    展开全文
  • 对比增强脚本,不是自己做的,是同事朋友做的
  • 图像对比度增强

    2014-12-15 10:01:11
    图像对比度增强 1、图像增强处理并不能增加原始图像的信息,只能增强对某种信息的辨别能力,而这种处理肯定会损失一些其它信息; 2、强调根据具体应用而言,更“好”更“有用”的视觉效果图像; 3、图像增强处理...

    图像对比度增强

    1、图像增强处理并不能增加原始图像的信息,只能增强对某种信息的辨别能力,而这种处理肯定会损失一些其它信息;

    2、强调根据具体应用而言,更“好”更“有用”的视觉效果图像;

    3、图像增强处理最大的困难——增强后图像质量的好坏主要依靠人的主观视觉来评定,也就是说,难以定量描述。

    图像对比度的增强技术可以分为两类:全局处理和局部处理

    局部对比度增强的技术有:

    (1)基于统计的局部增强方法
    (2)同态滤波方法
    (3)多尺度形态学方法
    展开全文
  • 联合优化和感知增强全局和局部对比度,以实现有效的对比度增强
  • 一种低对比度的图像增强方法 来源于互联网的资料
  • 图像对比度增强算法

    万次阅读 多人点赞 2017-01-17 17:53:19
    论述了几种基于灰度直方图的图像对比度增强算法。
  • 用c++实现图像对比度增强,通过点算子函数来增强图像对比度,参考书上的函数,自己写的代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,916
精华内容 25,166
关键字:

对比度增强方法