冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]第3章3.6原题:试解释为什么离散直方图均衡技术一般不能得到平坦的直方图?答:假设有一副图像,共有像素个数为n=MN(M行N列),像素灰度值取值范围为(0~255),那么该图像的灰度值的个数为L

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

 

   

 

 

第3章

 

 

3.6

原题:试解释为什么离散直方图均衡技术一般不能得到平坦的直方图?

答:假设有一副图像,共有像素个数为n=MN(M行N列),像素灰度值取值范围为(0~255),那么该图像的灰度值的个数为L=256,为了提高图像的对比度,通常我们都希望像素的灰度值不要都局促到某一个狭窄的范围,也就是我们通常说的图像灰度值的动态分布小。最好是在有效灰度值取值范围上,每个灰度值都有MN/L个像素,这个时候我们就可以得到一张对比度最理想的图像,也就是说像素的取值跨度大,像素灰度值的动态范围大。

因为直方图是PDF(概率密度函数)的近似,而且在处理中,不允许造成新的灰度级,所以在实际的直方图均衡应用中,很少见到完美平坦的直方图。因此,直方图均衡技术不能保证直方图的均匀分布,但是却可以扩展直方图的分布范围,也就意味着在直方图上,偏向左的暗区和偏向右的亮区都有像素分布,只是不能保证每个灰度级上都有像素分布。

(百度答案:)由于离散图像的直方图也是离散的,其灰度累积分布函数是一个不减的阶梯函数。如果映射后的图像仍然能取到所有灰度级,则不发生任何变化。如果映射的灰度级小于256,变换后的直方图会有某些灰度级空缺。即调整后灰度级的概率基本不能取得相同的值,故产生的直方图不完全平坦。

 

 3.8

原题:在某些应用中,将输入图像的直方图模型化为高斯概率密度函数效果会是比较好的,高斯概率密度函数为:

                                         冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

其中m和σ分别是高斯概率密度函数的均值和标准差。具体处理方法是将m和σ看成是给定图像的平均灰度级和对比度。对于直方图均衡,您所用的变换函数是什么?

答:直方图均衡变换函数的一般表达式如下:
                                                冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

在回答这个问题时,有两点非常重要,需要学生表达清楚。

第一,   这个表达式假定灰度值r只有正值,然而,高斯密度函数通常的取值范围是-∞~∞,认识到这点是非常重要的,认识到这点,学生才能以多种不同的方式来解决问题。对于像标准差这样的假设,好的答案是,需要足够小,以便于当r为小于0时,在pr(r)曲线下的面积可以被忽略。另一种回答就是,将值(不知道什么值)按比例增大,直到r小于0部分的曲线下的面积可以被忽略。

第二,要让学生认识到,变换函数本身,
                                              冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

并没有闭合形式解(closed-form solution)。这是高斯密度函数的累积分布函数,该函数或者是数字可积的,或者其值有表可查。

第三点,不是很重要,但学生要说清楚,那就是r的高端值(high-end value)。再强调一遍,高斯PDF是趋于正无穷(+∞)的,一个可行性的方法就是根据标准差,和前面一样对其做个假设。另一个可行方法就是除以一个足够大的值,使得在大于r部分函数曲线下的面积可以忽略(这实际上就是相当于比例缩小标准差)。

学生还需做的工作就是处理直方图,此时的变换函数是一种和的形式。负值和超过r的正值问题还是需要说明白,对于这些问题,前面建议的答案依然适用。学生需要指出,直方图是通过对连续函数采样得到的,所以对于采样的比特位数应该给出建议。最可能的答案是8比特,此时学生还需描述函数缩放比例,以便其取值在[0,255]范围之内。

 

Opencv中的均值和标准差函数meanStdDev

C++: void meanStdDev(InputArray src, OutputArray mean, OutputArray stddev, InputArray

mask=noArray())

C: void cvAvgSdv(const CvArr* arr, CvScalar* mean, CvScalar* std_dev, const CvArr* mask=NULL )

Python: cv.AvgSdv(arr, mask=None) -> (mean, stdDev)

Parameters

  src – 输入矩阵,通道数为1~4,input array that should have from 1 to 4 channels so that the results can be stored in

    Scalar_ ‘s.

  mean – 输出参数,数据类型为Match,用于保存均值。

  stddev –输出参数,数据类型为Mat,用于保存标准差。

  mask – 可选的mask运算。

函数meanStdDev 用于计算每个通道上的均值和标准差,分别保存在mean和std_dev中。

meanStdDev实例

#include <iostream>

#include <opencv2/opencv.hpp>

using namespace cv;

using namespace std;

int main()

{

    Mat img=imread(“D:/CodeWork/MyImage/baboon.jpg”,0);

   // imshow(“my test image!”,img);

    Mat mat_mean,mat_stddev;

    meanStdDev(img,mat_mean,mat_stddev);

    double m,s;

    m=mat_mean.at<double>(0,0);

    s=mat_stddev.at<double>(0,0);

    cout<<“mean=”<<m<<endl;

    cout<<“stddev=”<<s<<endl;

    waitKey();

    return 0;

}

输出结果如下:

 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

高斯PDF函数实例

在本例中,依然借用上一个实例中的图片的均值和方差,根据本题中的高斯PDF公式:

                                        冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

创建高斯概率密度函数曲线,即高斯PDF,该“曲线”实际上就是一个一维Mat型数据,用pr表示,p表示概率,r表示灰度级。上面的公式中的σ用s表示,只是为了方便,与前面的s不要弄混。

void plot(const Mat&src,const string winName="PlotWindow")
{
    int rows=src.rows,cols=src.cols ;
    if(rows!=1&&cols!=1)
    {
        cout<<"your input is not one dim!"<<endl;
        return;
    }
    double minv,maxv;
    minMaxLoc(src,&minv,&maxv);
    int wx=cols*1.4,wy=maxv*1.2;
    int blankLeft=cols*0.2;
    int blankBottom=maxv*0.1;
    namedWindow(winName);
    Mat img(wy,wx,CV_8UC3,Scalar::all(0));
    //绘制坐标轴
    Point origin(blankLeft,wy-blankBottom);
    Point arrowx(wx-10,wy-blankBottom);
    Point arrowy(blankLeft,10);
    plotCoordinate(img,origin,arrowx,arrowy,Scalar(0,255,255));
    //绘制高斯PDF曲线
    Point p1,p2;
    if(rows==1)
    {
        for(int i=0;i<cols-1;i++)
        {
            p1.x=i+blankLeft;
            p1.y=src.at<uchar>(0,i);
            p1.y =wy-p1.y-blankBottom;

            p2.x=i+1+blankLeft;
            p2.y=src.at<uchar>(0,i+1);
            p2.y=wy-p2.y-blankBottom;
            line(img,p1,p2,Scalar(255,0,255),3);
        }
    }
    else
    {
        for(int i=0;i<rows-1;i++)
        {
            p1.y=i;
            p1.x=src.at<uchar>(0,i);

            p2.y=i+1;
            p2.x=src.at<uchar>(0,i+1);
            line(img,p1,p2,Scalar(255,0,255),3);
        }
    }
    //cv::resize(img,img,Size(img.cols*2,img.rows*2));
    imshow(winName,img);
//有些系统不能按“alt+PrtSc”会直接退出,所以要用waitKey等待5秒,同时在主程序中也要有waitKey(),否则还是会自动退出。

  waitKey(500000);


}

 在plot()函数还调用了绘制坐标函数
void plotCoordinate(Mat& src,Point origin,Point px,Point py,Scalar color)

  src–准备绘制坐标轴的矩阵;
  origin–坐标原点;
  px     –x轴坐标端点;
  py   —-y轴坐标端点;
绘制坐标函数定义如下:

void plotCoordinate(Mat& src,Point origin,Point px,Point py,Scalar color)
{
    line(src,origin,px,color);
    line(src,origin,py,color);
    line(src,px,Point(px.x-10,px.y-3),color);
    line(src,px,Point(px.x-10,px.y+3),color);
    line(src,py,Point(py.x+3,py.y+10),color);
    line(src,py,Point(py.x-3,py.y+10),color);
}

下面是主程序:

int main()
{
    Mat img=imread("D:/CodeWork/MyImage/baboon.jpg",0);
    // imshow("my test image!",img);
    Mat mat_mean,mat_stddev;
    meanStdDev(img,mat_mean,mat_stddev);
    double m,s;//m是均值,s是标准差
    m=mat_mean.at<double>(0,0);
    s=mat_stddev.at<double>(0,0);
//    cout<<"mean="<<m<<endl;
//    cout<<"stddev="<<s<<endl;
    Mat pr(1,256,CV_64F,Scalar::all(0));
    s *=0.2;//标准差s分别乘以0.2,0.5,1,1.5,2时,观察高斯曲线的变化
    for(int r=0;r<256;r++)
    {
        pr.at<double>(0,r)= std::exp(-(r-m)*(r-m)/(2*s*s))/(sqrt(2*3.14)*s);
    }
    cv::normalize(pr,pr,1,0,NORM_MINMAX);
    pr=pr*255;//将取值范围扩展到255
    pr.convertTo(pr,CV_8U);

    cout<<"pr="<<endl<<pr<<endl;
    plot(pr,"s*0.2");
    waitKey();
    return 0;
}

下面是标准差s乘以0.2、0.5、1、1.5、2时,高斯PDF函数曲线的变化情况:

冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]  冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]   冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]  冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

 

接下来,我们利用上面五个不同标准差值,根据公式(3)将高斯概率密度分布函数转换成高斯概率累积分布函数,实现程序如下:
冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 
冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

从T(r)曲线的变化我们可以发现,随着标准差的增大,T(r)曲线越来越接近45°直线,当标准差放大6倍时,已经是一条45°直线了,这意味着标准差越大,该变换曲线,对变换结果的影响越小。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3.24

 

原题:证明如式(3.6-3)所示的拉普拉斯变换是各向同性的(即旋转不变)。您需要下列轴旋转θ角的坐标方程为:
                  冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

其中(x,y)为未旋转的坐标,而为旋转后的坐标。

答案:

坐标未旋转时的拉普拉斯运算表达式如下:
                        冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

坐标旋转后的表达式如下:
                       冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

我们已经知道,坐标旋转公式为:
                    冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

其中θ为旋转角度,为了证明前面两个拉普拉斯表达式的右边相等,我们先求解fx’的一阶导数在原坐标中的表达式:
                     冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

对上面的表达式继续微分得到:
                冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

同理,我们也可以求得的原坐标表达式:
               冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

将两个二阶微分表达式相加,我们就得到:
              冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]
这样我们就证明了,拉普拉斯运算是旋转无关的运算。

 

 

 

 

3.25 

中心为-4的拉普拉斯模板,执行的是水平和垂直方向上的差分运算。我们可以先考察一个 3×3的拉普拉斯模板,模板的中心值为-2,中心上下都为1,其它元素值为0,这样的模板只是执行了垂直方向的差分,

而与之正交的亮度值的变化却被忽略了,经过该模板处理的图像,只有在垂直方向的像素会被锐化增强。而中心值为-4的模板则同时对垂直和水平两个方向上进行微分处理,因此在垂直和水平两个方向的像素都得到了锐化增强,
这样的增强效果也会比单方向的锐化更明显。同样的,中心值为-8的模板对图像执行了四个方向上的锐化增强,这样通常会得到更好的锐化结果。

3.26

冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]      冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂] 冈萨雷斯《数字图像处理》第3版课后习题[通俗易懂]

                                      图3.26

 (a)  3×3 拉普拉斯模板的尺寸和系数是直接有方程(3.6-6)得到的,该方程为

2f(x,y)=f(x+1,y)+f(x-1,y)+f(x,y+1)+f(x,y-1)-4f(x,y)
换句话说,拉普拉斯模板中的数字,就是二阶微分方程中的系数。如果用一个更大的“类拉普拉斯模板”与图像卷积,并不会实现图像的二阶微分,所以我们也不要指望能够给出一个更加锐化的结果。
实际上,正如在(b)中解释的,不但不会锐化,反而变得模糊了。
(b)通常,增大“类拉普拉斯模板”的尺寸,会使图像变得模糊。为什么会这样呢?我们先假设有一个图像,该图像是由两个垂直的条带组成,左边是黑色条带右边是白色条带,黑白的分界线刚好通过
图像的中心,也就是说图像的中心有一个锐利的垂直边线,如图3.26所示。在书上正文98页,图3.36中,我们知道,当3×3拉普拉斯模板中心位于垂直边线上时,二阶微分会在垂直边线区域产生一
个双边线;这是由于当模板中心在垂直边线上继续移动超过两个像素时,该模板所包围的区域像素值相同,经卷积计算后该区域的值为0。然而,如果模板太大,当模板中心位于黑色区域时,模板的
一半完全处于黑色区域,而依据模板尺寸的大小,模板的一部分会处于图像的白色区域,这样卷积结果将不再是二阶微分的0,这意味着卷积后,本该为0的区域不再是0,图3.26显示了卷积效果。
图中左上角就是准备被处理的图像,紧挨着的图像是用中心为8的 3×3 拉普拉斯模板卷积结果。其它图像是分别用尺度 15×15, 35×35, 75×75,and 125 ×125类拉普拉斯模板卷积后的结果。随着模板尺寸
的增加,图像变得越来越模糊。

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/167516.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • LaTeX求和符号_matlab中求和符号怎么表示

    LaTeX求和符号_matlab中求和符号怎么表示Latex的求和公式:若想输出∑i=0n\sum_{i=0}^n∑i=0n​则需要输入:$\sum_{i=0}^n$其中,\sum是求和符号,下划线_之后为起始条件,^是终止条件

    2022年10月12日
  • 朋友圈加粗字体数字_独家:微信更新!公众号改版,朋友圈视频号直播置顶支持一键关闭…

    朋友圈加粗字体数字_独家:微信更新!公众号改版,朋友圈视频号直播置顶支持一键关闭…刚刚,微信安卓端内测更新至7.0.21版本,上线多项新功能,此前被大部分用户吐槽的“朋友圈置顶朋友分享视频号直播”功能也在这次得到了解决。1、“朋友圈置顶朋友分享的直播”支持一键关闭因为引起广泛讨论,此前“朋友圈置顶朋友分享的直播”曾短暂下线,这次回归,为运营者保留引流渠道的同时,也把该功能的开关权限交到了用户手上。更新后的“朋友圈置顶朋友分享的直播”,直播间卡片底部新增分享者头像,用户可以由此知…

  • pso粒子群优化算法例题_多目标优化算法

    pso粒子群优化算法例题_多目标优化算法粒子群算法属于智慧算法的一类,与该类算法类似的还有蚁群算法,遗传算法等。大家可以将这几种算法进行比较。粒子群优化算法(ParticleSwarmOptimization,PSO)属于进化算法的一种,是通过模拟鸟群捕食行为设计的。从随机解出发,通过迭代寻找最优解,通过适应度来评价解的品质。在这里,我们举一个例子来深入理解一下该算法:假设有一鸟群,在一座岛上某个地方放有食物,但是鸟群并不知道食…

    2022年10月11日
  • java如何调用第三方接口

    java如何调用第三方接口最近在做一个项目,因一些机制问题,需要我用java代码调用第三方接口。因其接口使用的是@RequestBody注入访问对象的,@RequestBody接受收的是一个json格式的字符串,一定是一个字符串。类似于:{“pageNumber”:1,“pageSize”:10}这种json字符串访问方式。要想在java后端代码中访问第三方接口,首先引入maven包。<dependency><groupId>org.codehaus.jackson

  • Web后端基础知识

    Web后端基础知识文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码如下(示例):importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltimportseabornassnsimportwarnings

  • 基于ossec logstash es大数据安全关联分析

    基于ossec logstash es大数据安全关联分析

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号