精华内容
下载资源
问答
  • 图像处理算法】直方图均衡化

    万次阅读 多人点赞 2019-03-26 20:24:54
    数字图像处理(第三版) 左飞. 图像处理中的数学修炼 目录 直方图均衡化的介绍 直方图的概念 直方图均衡化的理论基础 手工实现直方图均衡化 MATLAB上实现直方图均衡化 直方图均衡化的缺点 直方图均衡...

    参考文献:

    1. Rafael C. Gonzalez, Richard E. Woods,Digital Image Processing (Third Edition)
    2. 胡学龙. 数字图像处理(第三版)
    3. 左飞. 图像处理中的数学修炼

    目录

    直方图均衡化的介绍

    直方图的概念

    直方图均衡化的理论基础

    手工实现直方图均衡化

    MATLAB上实现直方图均衡化

    直方图均衡化的缺点


    直方图均衡化的介绍

    直方图均衡化是一种简单有效的图像增强技术,通过改变图像的直方图来改变图像中各像素的灰度,主要用于增强动态范围偏小的图像的对比度。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。换言之,直方图均衡化的基本原理是:对在图像中像素个数多的灰度值(即对画面起主要作用的灰度值)进行展宽,而对像素个数少的灰度值(即对画面不起主要作用的灰度值)进行归并,从而增大对比度,使图像清晰,达到增强的目的。举个例子,如图1所示,左图为原始图像,右图为直方图均衡化后的图像。

    图1 直方图均衡化前后效果对比

    直方图的概念

    对一幅灰度图像,其直方图反映了该图像中不同灰度级出现的统计情况。图2给出了一个直方图的示例,其中图(a)是一幅图像,其灰度直方图可表示为图(b),其中横轴表示图像的各灰度级,纵轴表示图像中各灰度级像素的个数。(需要注意,灰度直方图表示了在图像中各个单独灰度级的分布,而图像对比度则取决于相邻近像素之间灰度级的关系。)

    图 2 图像及其直方图

    在MATLAB中可以使用函数imhist()来计算灰度图像的直方图。我们计算一下图1中左图的灰度直方图,结果如图3所示。

    I = imread('pout.tif'); 
    figure; 
    subplot(121), imshow(I); 
    subplot(122), imhist(I); 
    axis([0, 256, 0, 4000]);
    图 3 灰度图像及其直方图

    严格地说,图像的灰度直方图是一个一维的离散函数,可写成:

                                                                         h(k)=n_{k}        k = 0, 1, ..., L-1                                                               (公式1)

    式中,n_{k}是图像f(x,y)中灰度级为k的像素的个数。直方图的每一列(称为bin)的高度对应n_{k}。直方图提供了原图中各种灰度值分布的情况,也可以说直方图给出了一幅图像所有灰度值的整体描述。直方图的均值和方差也是图像灰度的均值和方差。图像的视觉效果与其直方图有对应关系,或者说,直方图的形状和改变对图像有很大的影响。

    在直方图的基础上,进一步定义归一化的直方图为灰度级出现的相对频率P_{r}(k)。即:

                                                                                         P_{r}(k) = n_{k} / N                                                                             (公式2)

    式中,N表示图像f(x,y)的像素的总数,n_{k}是图像f(x,y)中灰度级为k的像素的个数。

    我们以图1中左图为例,计算其归一化的直方图,结果如图4所示。

    I = imread('pout.tif'); 
    N = numel(I);  % 求图像像素的总数
    Pr = imhist(I) / N; 
    k = 0 : 255; 
    figure; 
    subplot(121), imshow(I); 
    subplot(122), bar(k, Pr); 
    图 4 灰度图像及其归一化直方图

    直方图均衡化的理论基础

    为讨论方便起见,以 r 和 s 分别表示归一化了的原图像灰度和经直方图均衡化后的图像灰度(因为归一化了,所以 r 和 s 的取值在0到1之间)。当 r = s = 0时,表示黑色;当 r = s = 1时,表示白色;当 r, s ∈(0, 1)时,表示像素灰度在黑白之间变化。(所谓直方图均衡化,其实是根据直方图对像素点的灰度值进行变换,属于点操作范围。换言之,即:已知r,求其对应的s。)

    在 [0,1] 区间内的任何一个 r ,经变换函数 T(r) 都可以产生一个对应的 s ,且

                                                                                          s = T(r)                                                                                     (公式3)

    式中,T(r) 应当满足以下两个条件:

    1. 在 0 ≤ r ≤ 1 内,T(r) 为单调递增函数;(此条件保证了均衡化后图像的灰度级从黑到白的次序不变)
    2. 在 0 ≤ r ≤ 1 内有 0 ≤ T(r) ≤ 1。(此条件保证了均衡化后图像的像素灰度值在允许的范围内)

    公式3的逆变换关系为:

                                                                                       r = T^{-1}(s)                                                                                   (公式4) 

    式中,T^{-1}(s) 对 s 同样满足上述的两个条件。

    由概率论可知,如果已知随机变量 r 的概率密度是 p_{r}(r),而随机变量 s 是 r 的函数,则 s 的概率密度 p_{s}(s) 可以由 p_{r}(r) 求出。假定随机变量 s 的分布函数用 F_{s}(s) 表示,根据分布函数的定义有

                                                                       F_{s}(s) = \int_{-\infty }^{s}p_{s}(s)ds = \int_{-\infty }^{r}p_{r}(r)dr                                                        (公式5)

    又因为概率密度函数是分布函数的导数,因此公式5两边对 s 求导可得:

                                                 p_{s}(s) = \frac{\mathrm{d} F_{s}(s)}{\mathrm{d} s} = \frac{\mathrm{d} \left [ \int_{-\infty }^{r}p_{r}(r)dr \right ]}{\mathrm{d} s} = p_{r}(r)\frac{\mathrm{d} r}{\mathrm{d} s} = p_{r}(r)\frac{dr}{d[T(r)]}                                  (公式6)

    从公式6可以看出,通过变换函数 T(r) 可以控制图像灰度级的概率密度函数 p_{s}(s),从而改善图像的灰度层次,这就是直方图均衡化的理论基础。

    又有:从人眼视觉特性来考虑,一幅图像的灰度直方图如果是均匀分布的,那么该图像看上去效果比较好(参考冈萨雷斯数字图像处理3.3节)。因此要做直方图均衡化,这里的 p_{s}(s) 应当是均匀分布的概率密度函数。

    由概率论知识可知,对于区间 [a,b]上的均匀分布,其概率密度函数等于 \frac{1}{b-a}。 如果原图像没有进行归一化,即 r \in [0, L-1], 那么p_{s}(s) = \frac{1}{(L-1)-0} = \frac{1}{L-1},归一化之后 r \in [0, 1],所以这里的 p_{s}(s) = \frac{1}{1-0} = 1

     

    由公式6可以知道 p_{s}(s)ds = p_{r}(r)dr,又因为 p_{s}(s) = 1 ,所以有 ds = p_{r}(r)dr。对这个式子两边积分得:

                                                                             s = T(r) = \int_{0}^{r}p_{r}(r)dr                                                                         (公式7)

    公式7就是我们所求的变换函数 T(r)。它表明当变换函数 T(r) 是原图像直方图的累积分布概率时,能达到直方图均衡化的目的。

    对于灰度级为离散的数字图像,用频率来代替概率,则变换函数 T(r_{k}) 的离散形式可以表示为:

                                                                     s_{k} = T(r_{k}) = \sum_{i=0}^{k}p_{r}(r_{i}) = \sum_{i=0}^{k}\frac{n_{i}}{N}                                                                (公式8)

    式中,0 \leqslant r_{k} \leqslant 1k = 0, 1, 2, ..., L-1(注:这里的 r_{k} = \frac{k}{L-1},表示归一化后的灰度级;k表示归一化前的灰度级)。由公式8可以知道,均衡化后各像素的灰度级 s_{k} 可直接由原图像的直方图算出来。需要说明的是,这里的 s_{k} 也是归一化后的灰度级,其值在 0 到 1 之间;有时需要将其乘以L-1再取整,使其灰度级范围在 0 到 L-1之间,与原图像一致。

    手工实现直方图均衡化

    了解直方图均衡化的原理之后,我们以一个简单的例子来手工计算均衡化后的图像。这里我们假设存在以下这张图像(假定图像的灰度级范围是 [0, 9]):

    图 5 原始图像

    计算过程如下:

    第一步,计算原始图像的灰度直方图 n_{k}

    n(0) = 3,即原始图像中灰度级为0的像素的个数是3,直接从图5中可以数出来。按这样的方式分别得出 n(1)n(2), ..., n(9)。这里我们可以得到  n_{k}= [3,2,4,4,1,1,4,1,2,3]

    图 6 原始图像的灰度直方图

    第二步,计算原始图像的像素总个数。

    这里 N = 5*5 = 25

    第三步,计算原始图像的灰度分布频率。

    p_{r}(k) = n_{k} / N = [3/25,2/25,4/25,4/25,1/25,1/25,4/25,1/25,2/25,3/25]k = 0, 1, 2, ..., 9

    第四步,计算原始图像的灰度累积分布频率。

    s_{k} = \sum_{i=0}^{k}\frac{n_{i}}{N}= [3/25,5/25,9/25,13/25,14/25,15/25,19/25,20/25,22/25,25/25]k = 0, 1, 2, ..., 9

    第五步,将归一化的 s_{k} 乘以 L-1再四舍五入,以使得均衡化后图像的灰度级与归一化前的原始图像一致。

    s_{0} = \frac{3}{25} *(L-1) = \frac{3}{25} *9 = 1.08,四舍五入之后其值为1,也就是说原始图像中灰度级0对应均衡化后的灰度级1,即0→1。

    同理,s_{1} = 1.8,四舍五入之后为2,即1→2;s_{2} = 3.24,四舍五入之后为3,即2→3;s_{3} = 4.68,四舍五入之后为5,即3→5;s_{4} = 5.04,四舍五入之后为5,即4→5;s_{5} = 5.4,四舍五入之后为5,即5→5;s_{6} = 6.84,四舍五入之后为7,即6→7;s_{7} = 7.2,四舍五入之后为7,即7→7;s_{8} = 7.92,四舍五入之后为8,即8→8;s_{9} = 9,四舍五入之后为9,即9→9。

    以上的映射关系,就是变换函数 T(r) 的作用。

    第六步,根据以上映射关系,参照原始图像中的像素,可以写出直方图均衡化之后的图像,如图7所示。

    图 7 直方图均衡化之后的图像

    以上过程即为手动计算直方图均衡化。接着,我们看一下均衡化后图像的灰度直方图,如图8所示。

    图 8 均衡化后图像的灰度直方图

    根据图6和图8,说明一下直方图均衡化是如何增强图像对比度的。在图6中,原始图像灰度值为4,5,7的像素的个数为1,因此在图8中,这三个像素值点分别归并到相邻的灰度值中。因为有三个灰度值归并,因此在均衡化处理后,出现了三个空位,由这些空位将原来相邻的灰度值展开(举个例子:5和6相邻,均衡化后,变成5和7相邻),故而展宽了对比度,但是归并也带来了某些相邻像素对比度的降低(举个例子:4和5相邻,均衡化后,变成5和5相邻)。这也说明了直方图均衡化方法对灰度分布比较集中的图像的处理效果比较明显。

    MATLAB上实现直方图均衡化

    在MATLAB中提供了现成的函数histeq()来实现灰度图像的直方图均衡化,如下例所示:

    close all; 
    clear; 
    clc; 
    
    I = imread('pout.tif');
    J = histeq(I,256);
    imshowpair(I,J,'montage');
    图 9 使用函数histeq()进行直方图均衡化

    但为了演示说明算法的原理,下面将在MATLAB中自行编码实现灰度图像的直方图均衡化。通过代码来演示这个算法显然更加直观,更加易懂。

    close all; 
    clear; 
    clc; 
    
    % 首先读入灰度图像,并提取图像的高度和宽度
    image = imread('pout.tif'); 
    [height, width] = size(image); 
    
    % 然后统计每个灰度的像素值的累计数目
    NumPixel = zeros(1,256);  % 建立一个256列的行向量,以统计各灰度级的像素个数
    for i = 1 : height
       for j = 1 : width
           k = image(i,j);  % k是像素点(i,j)的灰度值
           % 因为NumPixel数组的下标是从1开始的,但是图像像素的取值范围是0~255
           % 所以用NumPixel(k+1)
           NumPixel(k+1) = NumPixel(k+1) + 1;  % 对应灰度值像素点数量加1 
       end
    end
    
    % % 这里我们将数组NumPixel显示出来,以观测效果
    % figure;
    % subplot(121), imshow(image);
    % subplot(122), bar(NumPixel);  % 灰度图像的直方图可以正确显示出来
    
    % 接下来,将频数值算为频率
    ProbPixel = zeros(1,256); % 统计各灰度级出现的频率
    for i = 1 : 256
        ProbPixel(i) = NumPixel(i) / (height * width);
    end
    
    % % 这里我们将数组ProbPixel显示出来,以观测效果
    % figure;
    % subplot(121), imshow(image);
    % subplot(122), bar(ProbPixel);  % 灰度图像的归一化直方图可以正确显示出来
    
    % 再用函数cumsum()来计算累积分布函数(CDF),并将频率(取值范围是0~1)映射到0~255的无符号整数
    CumPixel = cumsum(ProbPixel);  % 这里的数组CumPixel大小也是1×256
    CumPixel = uint8((256-1) .* CumPixel + 0.5); 
    
    % % 这里我们将数组CumPixel显示出来,以观测效果
    % figure;
    % subplot(121), imshow(image);
    % subplot(122), bar(CumPixel);  % 数组CumPixel可以正确显示出来 
    
    % 在下列用作直方图均衡化实现的赋值语句右端,image(i,j)被用来作为CumPixel的索引
    % 例如,image(i,j)=120,则从CumPixel中取出第120个值作为image(i,j)的新像素值
    outImage = uint8(zeros(height, width));  % 预分配数组
    for i = 1 : height
       for j = 1 : width
          outImage(i,j) = CumPixel(image(i,j));
       end
    end
    
    % 显示直方图均衡化前后的图像,可以发现,与调用函数histeq()的效果一致
    imshowpair(image, outImage, 'montage'); 

    实验效果如图10所示。

    图 10 自行编码实现的直方图均衡化效果

    上述讨论的是灰度图像的直方图均衡化。对于彩色图像而言,可以分别对R、G、B三个分量来做直方图均衡化,这也确实是一种方法。但有些时候,这样做很有可能会导致结果图像色彩失真。因此有人建议将RGB空间转换为HSV之后,对V分量进行直方图均衡化,以保证图像色彩不失真。(HSV分别指色调、饱和度、亮度)。

    下面我们采用图像处理工具箱中的测试用图(图11)分别做RGB空间和HSV空间的直方图均衡化。

    图 11 MATLAB自带的图像

    首先在RGB空间进行直方图均衡化处理。这里为了简便,直接调用MATLAB函数histeq()。

    close all; 
    clear; 
    clc; 
    
    I = imread('baby.jpg');
    % figure,imshow(I);
    
    % 分别提取R、G、B三个分量
    R = I(:, :, 1); 
    G = I(:, :, 2); 
    B = I(:, :, 3); 
    
    % 分别对三个分量进行直方图均衡化
    R = histeq(R, 256); 
    G = histeq(G, 256); 
    B = histeq(B, 256); 
    
    J = I;
    J(:, :, 1) = R; 
    J(:, :, 2) = G; 
    J(:, :, 3) = B; 
    
    imshowpair(I, J, 'montage'); 

    在RGB空间进行直方图均衡化的前后图像如图12所示。

    图 12 RGB空间直方图均衡化前后效果对比

    接下来,我们在HSV空间对V分量进行直方图均衡化处理。这里的代码可以采用调用MATLAB函数histeq()的方式,但是我们使用自行编码的方式进行处理。

    close all; 
    clear; 
    clc; 
    
    I = imread('baby.jpg'); 
    
    % 将RGB空间转换为HSV空间
    hsvImage = rgb2hsv(I); 
    
    % 提取V分量
    v = hsvImage(:, :, 3);  % 这里的v是double类型的矩阵
    
    % 以下代码与前面介绍基本一致,这里不再做过多注释
    [height, width] = size(v); 
    
    v = uint8(v .* 255 + 0.5); % 这里的0.5有必要加上,以免矩阵v中出现0
    
    N = zeros(1, 256); 
    for i = 1 : height
       for j = 1 : width
          k = v(i,j);
          N(k+1) = N(k+1) + 1; 
       end
    end
    
    ProbPixel = zeros(1, 256);
    for i = 1 : 256
        ProbPixel(i) = N(i) / (height * width); 
    end
    
    CumPixel = cumsum(ProbPixel);
    CumPixel = uint8(255 .* CumPixel + 0.5); % 四舍五入
    
    for i = 1 : height
       for j = 1 : width
          v(i,j) = CumPixel(v(i,j));  % 这里的v(i,j)不能为0,否则数组索引出错
       end
    end
    
    v = im2double(v); 
    hsvImage(:, :, 3) = v; 
    outImage = hsv2rgb(hsvImage); 
    
    imshowpair(I, outImage, 'montage');

    在HSV空间进行直方图均衡化的前后图像如图13所示。

    图 13 HSV空间直方图均衡化前后效果对比

    直方图均衡化的缺点

    如果一幅图像整体偏暗或者偏亮,那么直方图均衡化的方法很适用。但直方图均衡化是一种全局处理方式,它对处理的数据不加选择,可能会增加背景干扰信息的对比度并且降低有用信号的对比度(如果图像某些区域对比度很好,而另一些区域对比度不好,那采用直方图均衡化就不一定适用)。此外,均衡化后图像的灰度级减少,某些细节将会消失;某些图像(如直方图有高峰),经过均衡化后对比度不自然的过分增强。针对直方图均衡化的缺点,已经有局部的直方图均衡化方法出现。

    展开全文
  • 图像处理算法

    2014-05-30 15:09:42
    Alphat透明合成系统源代码源代码 3K   ...腐蚀-膨胀-细化算法源代码 16K ...图案抖动技术处理系统源代码 23K   图象边沿检测-提取-轮廓跟踪算法源代码 33K  
    展开全文
  • 图像处理算法】Hough变换

    万次阅读 多人点赞 2018-06-14 14:34:46
    2. 《数字图像处理的MATLAB实现(第二版)》, Rafael C. Gonzalez 3. MATLAB帮助文档 Hough变换于1962年由Paul Hough提出,是一种使用表决方式的参数估计技术,其原理是利用图像空间和Hough参数空间的线-点对偶...

    参考: 

    1. https://www.zybuluo.com/lutingting/note/554459 

    2. 《数字图像处理的MATLAB实现(第二版)》, Rafael C. Gonzalez

    3. MATLAB帮助文档

     

    Hough变换于1962年由Paul Hough提出,是一种使用表决方式的参数估计技术,其原理是利用图像空间和Hough参数空间的线-点对偶性,把图像空间中的检测问题转换到参数空间中进行。

    下面参考https://www.zybuluo.com/lutingting/note/554459 

    1. 极坐标系

    极坐标系(polar coordinates)是指在平面内由极点O、极轴L、极径r组成的坐标系。如下图展示了一个极坐标系,图中两个红点是要利用极坐标表示的两个点,黑点是极坐标系的极点。

    2. 极坐标系和直角坐标系的关系

    在直角坐标系下,点P的坐标表示为

    在极坐标系下,点M的坐标表示为

    可以根据下图对极坐标和直角坐标进行相互之间的转换

    注:本图中的r与上图中的ρ是同样的表述

    3. 极坐标系和直角坐标系中的直线

    在极坐标系中,应该如何表示直线方程呢?如上图所示,有一直线L,点P是直线L上的任意一点,其对应的直角坐标为(x,y),该点的极坐标为(r,φ),该直线到原点O的距离为ρ。

    首先,由图可知:ρ = r * cos( θ - φ ),然后根据三角函数的关系对该式展开,可得:

    ρ = r * cos( θ - φ )  = r * cosθcosφ + r * sinθsinφ

    又根据点P的直角坐标(x,y)和极坐标(r,φ)之间的关系:x=r*cosφ, y=r*sinφ,代入到上式中,可以得到ρ=xcosθ+ysinθ

    所以直线L的极坐标方程就是ρ=xcosθ+ysinθ。

    上式中(x,y)是直线L上的任意一点。也就是说,给出极坐标系中的一个点(ρ,θ),可以唯一确定直角坐标系中的一条直线其中ρ表示直角坐标系下直线到原点O的距离,θ表示直角坐标系下直线和原点间的垂线与x轴正向的夹角。或者说,直角坐标系中的直线在极坐标系下表示为一个点。这即是极坐标系和直角坐标系的点-线对偶性。

    4. 利用Hough变换检测直线

    下面的例子形象地展示了如何利用Hough变换进行直线检测。记住上面的结论:直角坐标系中的一条直线对应于极坐标系下的一个点。这里的直角坐标系对应于原始图像空间,极坐标系对应于参数空间(也叫Hough空间)。

    · 给定一幅图像,如下所示,图像中有一条直线

    · 首先进行边缘检测,找出边缘点,如下图所示,红色的点表示边缘点

    · 对于任何一个边缘点,找到所有可能经过该点的直线,这些直线都各自对应着参数空间中的一个点,而该边缘点的无穷多条直线对应于参数空间中的点将形成一条参数空间中的曲线。如下左边两图所示,原始图像空间中绿色的直线在参数空间中对应的点是(r2,θ2),原始图像空间中蓝色的直线在参数空间中对应的点是(r1,θ1)。如下右边两图所示,找出经过该边缘点的所有直线,列出各直线在参数空间中的点,这些点可以连接成一条曲线。

           

    · 曲线如下图所示,最终我们可以用这条曲线来表示所有可能经过第1个边缘点的直线

    · 重复上述过程,画出所有边缘点的曲线,每个边缘点都对应着参数空间中的一条曲线。那么,参数空间中所有这些曲线的交点一定是原始图像空间中所有边缘点的共同直线。或者说某个交点经过的曲线最多(此处涉及到表决,如何判断这个交点经过的曲线最多),那么这个交点很有可能表示原始图像中的直线。得到这个交点的坐标(ρ,θ)之后,根据方程ρ=xcosθ+ysinθ,可以计算出直角坐标系下的直线,然后在原始图像中标出直线,达到检测直线的目的。

    下面参考《数字图像处理的MATLAB实现(第二版)》

    如上图所示。图a说明了参数ρ和θ的几何解释。水平线的θ=0,ρ等于正的x截距;相似的,垂直线θ=90°,ρ等于正的y截距。或者θ=-90°,ρ等于负的y截距。

    图b中的两条曲线分别表示通过图a中两个特定点(xi, yi)和(xj, yj)的一簇直线。交叉点对应于通过(xi, yi)和(xj, yj)的直线。

    Hough变换在计算上的诱人之处是把ρθ空间再细分为所谓的累加单元。正如上图c中说明的那样,其中的(ρmin, ρmax)和(θmin, θmax)是预期的参数值范围。一般来说,值的最大范围是-90°≤θ≤90°和-D≤ρ≤D,其中D是图像中两个角之间的最远距离。

    图c中,在坐标(i,j)的单元位置,累加器的值是A(i,j),对应于参数空间坐标(ρi,θj)的小正方形。最初,这些单元位置均为0。然后,对于原始图像空间中的每个非背景点(xk,yk)(图a中),我们令θ等于在θ轴上允许的细分值,并通过公式ρ=xk*cosθ+yk*sinθ解出相应的ρ值。然后,得到的ρ值四舍五入为最接近的ρ轴上允许的单元值。相应的累加器单元增加一个增量。在这个过程的最后,累加单元A(i,j)中的值Q表示参数空间中的点(ρi, θj)有Q条曲线经过,对应到原始图像空间中,也就是有Q个点是在一条相同的直线上的。ρθ平面上,细分的数目决定了这些点共线的精确度。累加器数组在工具箱中叫做Hough变换矩阵,简称Hough变换。

    与Hough变换有关的工具箱函数

    图像处理工具箱中提供了3个与Hough变换相关的函数。函数hough()实现了前面讨论的概念;函数houghpeaks()寻找Hough变换的峰值(累加单元的高计数);函数houghlines()以来自其他两个函数的结果为基础在原始图像中提取线段。

    1. 函数hough()

    默认语法是: [ H, theta, rho ] = hough(f) 

    完整语法是: [ H , theta, rho ] = hough(f, 'ThetaRes', val1, 'RhoRes', val2)

    其中,H是Hough变换矩阵,theta(单位是度数)和rho是θ和ρ向量,在这些值上产生Hough变换。输入f是二值图像,val1是0到90的标量,指定了沿θ轴Hough变换的间距(默认是1),val2是0到hypot(size(f,1), size(f,2))之间的实标量,其中函数hypot()表示平方和的平方根,指定了沿ρ轴Hough变换的间隔(默认是1)。

    举例:hough变换的说明,在这个例子中,我们用简单的合成图像来说明hough函数的机理。

    % 创建合成图像
    f = zeros(101, 101); 
    f(1, 1) = 1; 
    f(101, 1) = 1; 
    f(1, 101) = 1; 
    f(101, 101) = 1; 
    f(51, 51) = 1;
    
    % 显示合成图像
    figure; 
    subplot(121), imshow(f); 
    
    % 采用默认值进行hough变换,并显示hough变换的结果
    H = hough(f); 
    subplot(122), imshow(H, []);

    接下来,我们调用带有三个参数的hough函数。然后把向量theta和rho作为附加输入参量传递给函数imshow(),从而控制水平轴和垂直轴的标度。我们还要把 'InitialMagnification' 选项传递给带有值 'fit' 的imshow函数,因此整个图像将被强迫在图形窗口中进行装配。axis函数被用来打开轴标记,并使其显示填充图的矩形框。最后,xlabel和ylabel函数用希腊字母LaTeX字体符号在轴上标值。

    % 创建合成图像
    f = zeros(101, 101); 
    f(1, 1) = 1; 
    f(101, 1) = 1; 
    f(1, 101) = 1; 
    f(101, 101) = 1; 
    f(51, 51) = 1;
    
    % 显示合成图像
    figure; 
    subplot(121), imshow(f); 
    
    % 采用完整语法形式调用hough函数
    [ H, theta, rho ] = hough(f, 'ThetaRes', 1, 'RhoRes', 1); 
    subplot(122), imshow(H, [], 'XData', theta, 'YData', rho, 'InitialMagnification', 'fit'); 
    axis on;
    axis normal; 
    xlabel('\theta'); % 加上\后x坐标轴显示θ,否则显示theta
    ylabel('\rho');

    接下来分析一下上图,左图为原始图像空间,有5个目标点,右图为参数空间,有5条对应的曲线。三条曲线(直线可视为曲线)在±45°处的有交点,说明在原始图像空间中在±45°处各有3个点共线。两条曲线在(ρ,θ)=(0,-90)、(-101,-90)、(0,0)、(101,90)、(0,90)处有交点,说明原始图像空间中有4组位于垂直线和水平线上的共线点。

    2. 函数houghpeaks()

    线检测和线连接用的Hough变换,第一步是用高的计数寻找累加单元(工具箱中把高的计数单元作为峰值)。

    函数作用:确定Hough变换中的峰值(identify peaks in hough transform)

    语法形式

    peaks = houghpeaks(H, numpeaks)    或者    peaks = houghpeaks(..., Name, Value, ...)

    描述

    peaks = houghpeaks(H, numpeaks) locates peaks in the Hough transform matrix, H, generated by the hough function. 参数 numpeaks 指定了需要确定的峰值个数。函数返回 peaks,它是一个包含峰值点行坐标和列坐标的矩阵(从后面示例代码中可知,这个矩阵是一个两列矩阵,第一列保存的是ρ,第二列保存的是θ)。peaks = houghpeaks(..., Name, Value, ...) locates peaks in the Hough transform matrix, 这里使用命名的参数控制各项操作。

    MATLAB帮助文档中的示例:(为了更直观地显示处理效果,代码有改动)

    locate and display peaks in hough transform of rotated image ( 定位并显示旋转图像的hough变换中的峰值点 )

    close all; clear all; clc; 
    
    % Read image into workspace
    I = imread('circuit.tif'); 
    figure; 
    subplot(121), imshow(I); 
    
    % Create binary image
    BW = edge(imrotate(I, 50, 'crop'), 'canny');
    subplot(122), imshow(BW); 
    
    % Create hough transform of image
    [H, theta, rho] = hough(BW);
    figure, imshow(H, [], 'InitialMagnification', 'fit'); 
    axis normal;
    
    % Find peaks in the hough transform of the image and plot them
    P = houghpeaks(H, 3); 
    figure, imshow(H, [], 'XData', theta, 'YData', rho, 'InitialMagnification', 'fit'); 
    xlabel('\theta'), ylabel('\rho'); 
    axis on, axis normal, hold on; 
    plot(theta(P(:, 2)), rho(P(:, 1)), 's', 'color', 'red'); 

      

    在图像中找出了3个峰值点,均用红色矩形框标记出来了。

    3. 函数houghlines()

    函数作用

    根据Hough变换提取线段(extract line segments based on hough transform)

    语法形式

    lines=houghlines(BW, theta, rho, peaks)  

    lines=houghlines(..., Name, Value, ...)

    描述

    lines=houghlines(BW, theta, rho, peaks)提取图像BW中对应于Hough变换下特定峰点的线段(extract line segments in the image BW associated with particular bins in a Hough transform)。(这里把bin理解为hough变换中的峰点,不知道确不确切)。theta和rho是由函数hough()返回的向量。peaks是函数houghpeaks()返回的用于寻找线段的矩阵,该矩阵包含了Hough变换下特定峰点的行坐标和列坐标。返回值lines是一个结构数组,它的长度等于寻找到的线段的数量。

    lines=houghlines(..., Name, Value, ...)提取图像BW中的线段,这里命名的参数会影响函数的操作。(额,翻译过来就是这个样子)。

    MATLAB帮助文档中的示例:(稍有改动)

    Find line segments and Highlight longest segment(寻找线段并使最长的线段高亮)

    close all; clear all; clc; 
    
    % Read image into workspace
    I = imread('circuit.tif'); 
    figure; 
    subplot(131), imshow(I); 
    
    % Rotate the image
    rotI = imrotate(I, 33, 'crop'); 
    subplot(132), imshow(rotI); 
    
    % Create a binary image
    BW = edge(rotI, 'canny'); 
    subplot(133), imshow(BW); 
    
    % Create the hough transform using the binary image 
    [H, T, R] = hough(BW); 
    figure, imshow(H, [], 'XData', T, 'YData', R, 'InitialMagnification', 'fit'); 
    xlabel('\theta'), ylabel('\rho'); 
    axis on, axis normal, hold on;
    colormap(gca, hot);
    
    % Find peaks in the hough transform of the image
    P = houghpeaks(H, 5); 
    x = T(P(:,2));
    y = R(P(:,1)); 
    plot(x, y, 's', 'color', 'blue'); 
    
    % Find lines and plot them
    lines = houghlines(BW, T, R, P, 'FillGap', 5, 'MinLength', 7); 
    figure, imshow(rotI), hold on; 
    max_len = 0; 
    for k = 1 : length(lines)  % here length(lines)=12
       xy = [lines(k).point1; lines(k).point2]; 
       plot(xy(:, 1), xy(:, 2), 'LineWidth', 2, 'Color', 'green');
       
       % Plot beginnings and ends of lines
       plot(xy(1,1), xy(1,2), 'x', 'LineWidth', 2, 'Color', 'yellow');
       plot(xy(2,1), xy(2,2), 'x', 'LineWidth', 2, 'Color', 'red'); 
       
       % Determine the endpoints of the longest line segment
       len = norm(lines(k).point1 - lines(k).point2); % distance between point1 and point2
       if ( len > max_len )
          max_len = len; 
          xy_long = xy; 
       end
    end
    
    % Highlinght the longest line segment by coloring it cyan
    plot(xy_long(:, 1), xy_long(:, 2), 'LineWidth', 2, 'Color', 'cyan'); 


       

    展开全文
  • 图像处理算法】图像处理之误差扩散(抖动)算法 一、算法简介 误差扩撒法在数据处理中经常碰到,尤其是用于图像处理中,降低色彩的深度。下面有三张图,【图一】256级(8bit)灰度过度 【图二】将图一转换成16级...

              【图像处理算法】图像处理之误差扩散(抖动)算法

    一、算法简介

    误差扩撒法在数据处理中经常碰到,尤其是用于图像处理中,降低色彩的深度。下面有三张图,【图一】256级(8bit)灰度过度      【图二】将图一转换成16级(8bit)灰度(高4位不变,低4位置0)       【图三】将图一用误差扩散法转换成16级灰度。(256级灰度指共256种灰度值,16级灰度指共16种灰度值)

    801 字节         646 字节           2539 字节

    【图一】                     【图二】                        【图三】

    很明显,同是16级灰度,但是【图三】的效果明显好于【图二】,其原因是【图二】使用的是误差扩撒算法。

    顾名思义,误差扩撒,就是色彩深度降低时,将像素的变化的误差扩撒开去,使得肉眼在观察图片的时候,相邻的像素点集合整体的误差变小,就比如:人在下楼梯时,如果台阶过高,容易扯着蛋;要是同样的高度能多有几个台阶,那么台阶之间的距离变小了,那么扯蛋效应就会减小甚至消失(不好意思,我称之为扯蛋效应)。

    二、具体过程

    1、如果我们要将这一张256级灰度的图片转换成16级灰度,最简单的办法就是将每个像素的后四位置0。例如256级灰度值是120,转换成16级灰度值则有:120/16=7.5,7*16=112,即16级灰度值为112,那么存在120-112=8(即0.5*16=8)的像素差值,这就是误差。如果不利用这个误差信息,则就是【图二】的效果。

    256级灰度转化16级灰度方法:即把256级灰度平均分成16等分,转化的时候,只需要判断256级灰度在16等分中的哪一个区间,然后用该区间的最小值作为16级灰度的灰度值。即:

    if((x>0) && (x<=16))
    	Grayscale_value = 0=16;
    else if((x > 16)&&( x<=32))
    	Grayscale_value = 32;
    else if((x > 32)&&( x<=48))
    	Grayscale_value = 48;
    else if((x > 48)&&( x<=64))
    	Grayscale_value = 64;
    else if((x > 64)&&( x<=80))
    	Grayscale_value = 80;
    else if((x > 80)&&( x<=96))
    	Grayscale_value = 96;
    else if((x > 96)&&( x<=112))
    	Grayscale_value = 112;
    else if((x > 112)&&( x<=128))
    	Grayscale_value = 128;
    else if((x > 128)&&( x<=144))
    	Grayscale_value = 144;
    else if((x > 144)&&( x<=160))
    	Grayscale_value = 160;
    else if((x > 160)&&( x<=176))
    	Grayscale_value = 176;
    else if((x > 176)&&( x<=182))
    	Grayscale_value = 182;
    else if((x > 182)&&( x<=198))
    	Grayscale_value = 198;
    else if((x > 198)&&( x<=214))
    	Grayscale_value = 214;
    else if((x > 214)&&( x<=230))
    	Grayscale_value = 230;
    else if((x > 230)&&( x<=246))
    	Grayscale_value = 246;
    else if((x > 246))
    	Grayscale_value = 255;

    也可以像原作者那样直接按照公式计算。
    2、误差扩散(抖动),为了解决【图二】的现象,我们来利用这个误差,即将这个误差扩散到该像素点的周围,而不是由该像素完全承担这个误差。这样从视觉方面来看,就会更平缓,更容易接受。我们按照3:2:3的比例将8这个误差分批到该像素点的右边,右下,下边这些周围的像素点上,即右边像素=右边像素+3,右下像素=右下像素+2,下边像素=下边像素+3,如此一来,处理完整个图像的每个像素点,是不是比直接截尾的效果要好很多呢?

    在上述说明中这个误差8的举例有点特殊,误差是13,则按3:2:3得分配的误差为2,1,2(或者四舍五入的3,2,3)。

    事实上,3:2:3的效果也不是最好的分配误差法案,你还可以试一试下面的分法(也可以自己构造):

     

    其中X指的是要转换的像素点,周围的瓜分误差的比例。

    ok,这个算法还是比较有用的,由于比较简单,就不给出代码了,可以自己实现一下。
    ————————————————
    版权声明:本文为CSDN博主「hujingshuang」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/hujingshuang/article/details/45716445

    展开全文
  • 有趣的图像处理算法

    千次阅读 2018-07-30 10:48:32
    之前见了一些文章讨论了一些有趣的图像处理算法 下面总结列出: 在研究的过程中,有时候会碰到很多有意思的图像处理算法,算法极具新意,并且能够产生非常有意思的结果。 算法简介 1、图像镶嵌 图像镶嵌也叫...
  • 图像处理算法工程师

    万次阅读 2015-03-13 22:42:54
    整理了一下网上各个公司图像处理算法工程师的招聘要求:  图像处理算法工程师 职位要求 编程技能: 1、 具有较强的编程能力和良好的编程习惯, 精通c/c++编程,并熟练使用VS 或matlab开发环境; 2、 在计算机...
  • 一些基本数字图像处理算法

    千次阅读 2018-12-12 17:03:01
    一些基本数字图像处理算法 所有的图像算法都在DIPAlgorithm类中,并且所有算法都为抽象成员函数。我已经按照java注释规范为所有方法添加使用说明注释,具体实现可见于DIPAlgorithm.java,这里只做算法说明。 1 图像...
  • 图像处理算法其实都很简单

    万次阅读 多人点赞 2018-05-03 16:07:12
     线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果。做法很简单。首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像...
  • 基于C++的图像处理算法实现、INTEL CPU上SSE加速、ARM CPU上NEON加速 资源下载地址:下载地址 目录 1.常用图像处理算子实现 2.常用图像处理算子基于Arm指令集Neon的实现 3.常用图像处理算子基于intel 指令集SSE...
  • 神奇的图像处理算法

    千次阅读 2012-11-13 09:56:58
    神奇的图像处理算法 作者: 阮一峰 日期: 2011年8月13日 几周前,我介绍了相似图片搜索。 这是利用数学算法,进行高难度图像处理的一个例子。事实上,图像处理的数学算法,已经...
  • 嵌入式图像处理算法优化

    千次阅读 2017-08-26 16:04:11
    嵌入式图像处理算法优化指南,适用于任何基于ARM或PC平台的视觉应用程序开发 转载2015-08-05 15:09:15 标签:目标识别与跟踪视觉定位与目标识别视觉算法研究与验证视频图像处理开发板it 第一章 绪论 ...
  • ·能从硬件结构方面消除不利影响,最好不要从图像算法方面消除不利影响(预防隐患法则) ·截至目前为止,图像算法没有一个标准的算法流程适合所有的图像处理,所以具体...·图像处理算法一定是定量分析算法,模...
  • Python借助Pillow使用嵌套循环实现图像处理算法:拷贝图像、剪裁图像、翻转图像、旋转图像、平滑图像过滤器
  • 奇妙的图像处理算法

    千次阅读 2016-04-12 22:50:52
    导读 图像处理(image processing),用计算机对图像进行分析,以达到所需结果的技术。又称影像处理。...Scriptol列出了几种神奇的图像处理算法,让我们一起来看一下。 http://www.scriptol.com/program
  • PhotoShop 图像处理 算法 汇总 置顶2015年01月15日 17:41:34 阅读数:7104 不定期更新 ...... 直接点标题即可链接到原文。 OpenCV 版:OpenCV 图像处理   图层混合算法:   PS图层混合算法之一(不透明度,...
  • 水下图像处理算法Sea-thru

    千次阅读 2020-10-10 21:33:52
    水下图像处理算法Sea-thru,出自CVPR 2019,被称之为将彻底改变水下计算机视觉的“革命性工具”。 代码开源 https://github.com/jgibson2/sea-thru (非官方) 还没发现预训练模型地址
  • 手背静脉识别的图像处理算法

    千次阅读 2020-04-04 11:48:34
    手背静脉识别的图像处理算法 题目内容及要求 手背静脉识别技术作为一种全新的特征识别技术,相比于传统的生物识别技术(如指纹识别)具有许多明显的优势,然而对于该技术的研究尚处于刚刚起步阶段,使用计算机来直接...
  • 图像处理算法--高斯模糊

    千次阅读 2018-12-05 15:44:12
    图像处理算法--高斯模糊 高斯模糊(英语:Gaussian Blur),也叫高斯平滑,是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果,通常用它来减少图像噪声以及降低细节层次。 高斯模糊相信...
  • 经典常用的图像处理算法,及其C实现,每个文件夹下都包含其相应源代码和处理前后的图片
  • 整理智能车中使用到的摄像头图像处理算法

    千次阅读 多人点赞 2020-10-15 13:56:08
    整理智能车中使用到的摄像头图像处理算法 19年的智能车竞赛给我留下了很深远的影响,不管是算法思路还是解决问题的方法对我来说都受益匪浅。今天整理资料时又翻出这些代码,回忆起做车时不分日夜地在赛道上调试,...
  • FPGA的图像处理算法

    千次阅读 2019-02-25 15:07:47
    下面简要分析了 FPGA 技术,包括 FPGA 技术原理和技术特点等,随后介绍一下FPGA 的图像处理系统算法的实现,包括存储模块、运算单元、控制模块以及数据传输模块等内容。 智能机器人、多媒体已经计算机的诞生都离不...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,327
精华内容 10,930
关键字:

图像处理算法