第3章

3.6

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

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

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

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

3.8

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

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

答:直方图均衡变换函数的一般表达式如下:
                                                

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

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

第二,要让学生认识到,变换函数本身,
                                              

并没有闭合形式解(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;

}

输出结果如下:

高斯PDF函数实例

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

创建高斯概率密度函数曲线,即高斯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)将高斯概率密度分布函数转换成高斯概率累积分布函数,实现程序如下:
   
  

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

 

3.24

原题:证明如式(3.6-3)所示的拉普拉斯变换是各向同性的(即旋转不变)。您需要下列轴旋转θ角的坐标方程为:
                  

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

答案:

坐标未旋转时的拉普拉斯运算表达式如下:
                        

坐标旋转后的表达式如下:
                       

我们已经知道,坐标旋转公式为:
                    

其中θ为旋转角度,为了证明前面两个拉普拉斯表达式的右边相等,我们先求解fx’的一阶导数在原坐标中的表达式:
                     

对上面的表达式继续微分得到:
               

同理,我们也可以求得的原坐标表达式:
               

将两个二阶微分表达式相加,我们就得到:
              
这样我们就证明了,拉普拉斯运算是旋转无关的运算。

3.25

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

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

3.26

          

图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类拉普拉斯模板卷积后的结果。随着模板尺寸
的增加,图像变得越来越模糊。

转载于:https://www.cnblogs.com/phoenixdsg/p/8215668.html

冈萨雷斯《数字图像处理》第3版课后习题相关推荐

  1. 冈萨雷斯--数字图像处理(MATLAB版)----书籍相关网站

    www.prenhall.com/gonzalezwoodseddins 这个网站与Gonzales and Wood 所著的<数字图像处理>一书的网站集成在一起: www.prenhal ...

  2. 数字图像处理第三版(冈萨雷斯)——第一章绪论

    数字图像处理第三版(冈萨雷斯)--第一章绪论 一.主要目的 二.关于什么是数字图像处理的几个重要概念 2.1 强度或灰度: 2.2 数字图像: 2.3 数字图像处理: 2.4 像素: 2.5 低级.中 ...

  3. 图像插值和缩放(matlab自实现)--冈萨雷斯《数字图像处理第三版》

    图像插值和缩放(matlab自实现) 1.Explanations of interpolation(插值释义) 1.1 Nearest Neighbor Interpolation(最近邻插值) 1 ...

  4. 计算机图形学基础第二版,计算机图形学基础(第2版)课后习题答案__陆枫.pdf

    计算机图形学基础(第2版)课后习题答案__陆枫 第一章绪论 概念:计算机图形学.图形.图像.点阵法.参数法. 图形的几何要素.非几何要素.数字图像处理: 计算机图形学和计算机视觉的概念及三者之间的关系 ...

  5. 计算机图形学基础何云峰,计算机图形学基础第版课后习题答案陆枫何云峰.doc...

    计算机图形学基础第版课后习题答案陆枫何云峰 第一章 绪论 概念:计算机图形学.图形.图像.点阵法.参数法. 图形的几何要素.非几何要素.数字图像处理: 计算机图形学和计算机视觉的概念及三者之间的关系: ...

  6. 整理对应_JSP第二版课后习题答案【侵权联系我删除】

    JSP第二版课后习题下载:https://download.csdn.net/download/weixin_42859280/11265785 JSP第二版课后习题答案下载:https://down ...

  7. matlab 霍特林变换,数字图像处理(第3版面向CS2013计算机专业规划教材)

    导语 内容提要 姚敏编著的<数字图像处理(第3版面向CS2013计算机专业规划教材)>详细介绍了数字图像处理的基本理论.主要技术和最新进展.全书共分13章,内容主要包括图像获取.图像变换. ...

  8. c语言二分答案最小值,C语言程序设计第2版课后习题答案(贾宗璞许合利人民邮电-第2版).doc...

    C语言程序设计第2版课后习题答案(贾宗璞许合利人民邮电-第2版) C语言习题答案 第1章 1.选择题 (1) C (2) B (3) 2.填空题 (1)main (2) main (3) 有穷性.确定 ...

  9. c语言程序设计第五版课后习题答案谭浩强第八章课后题

    c语言程序设计第五版课后习题答案谭浩强第八章课后题 输入三个字符串,按由大到小的顺序输出 要求用指针实现 输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个属兑换.写三个函数:1.输入 ...

  10. JSP第二版课后习题答案初步不含颜色,冗杂【侵权联系我删除】

    JSP第二版课后习题下载:https://download.csdn.net/download/weixin_42859280/11265785 JSP第二版课后习题答案下载:https://down ...

最新文章

  1. 首届清华智班30人名单公布:贵校第一批AI本科生,状元金牌云集,与姚班“抢人”...
  2. 十六进制数转换成float类型数据数据的经典代码
  3. python数据类型所占字节数_python标准数据类型 Bytes
  4. hdu 1712 ACboy needs your help
  5. Linux 查看dns运行状态
  6. elasticsearch服务相关脚本
  7. Pywinauto在Windows Twain Driver自动化测试中的应用研究
  8. ubuntu shell 直接输入密码
  9. RGBA 图片格式转换 RGB 无损
  10. 如何用java模拟饭店点菜,【模拟饭店2怎么玩】餐厅攻略大全
  11. Parameterize Method (令函数携带参数)
  12. android 蓝牙传输速率,android蓝牙rfcomm连接速度太慢
  13. 玩转docker之mysql容器(常见问题汇总-续更)
  14. 北航2017级算法第一次上机---芸如的入学测试
  15. bzoj3168 钙铁锌硒维生素 (矩阵求逆+二分图最小字典序匹配)
  16. 自动化的内容生成语言模型如何帮助您赢得seo竞赛
  17. 华为防火墙双机热备(link-group和Eth-trunk)
  18. AX7A200教程(3): DDR3突发读写
  19. 从零开始学USB(二十二、USB接口HID类设备(四)_报表描述符Local类)
  20. 用计算机对PLC进行编程时,PLC编程中的五个常见问题

热门文章

  1. MyBatis逆向工程--MyBatis Generator (MBG)代码生成工具的使用
  2. 百度提示:违法违规网页,建议关闭的解决方案
  3. android接听ios电话,有了这个神器,在PC上也能接听iPhone电话、收发短息啦(安卓也可以哦~)...
  4. 如何安装国内源(阿里云yum源)
  5. [线性代数]行列式(mooc秦静老师讲解)
  6. 囚徒困境困境_设计工具困境
  7. 如何比较两个json
  8. JavaCV音视频开发宝典:UDP推流 使用UDP方式推送TS流 实现UDP一对一直播点播
  9. 一文8个步骤从0到1实现Python+Selenium自动化测试项目实战【建议收藏】
  10. 将QIIME2学习进行到底