.OPenCV提高图像对比度(掩膜操作)的两种方法.pdfVIP

.OPenCV提高图像对比度(掩膜操作)的两种方法.pdf

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
.OPenCV提高图像对比度(掩膜操作)的两种方法

OPenCV提高图像对比度(掩膜操作)的两种方法 实现原理: 采用掩膜操作来提高图像对比度 矩阵的掩码操作相当简单。我们根据一个掩膜矩阵(也称为内核)重新计算每 个像素值。这个掩码包含的值将会调整相邻像素(以及当前像素)对新像素值的影 响。从数学的角度来看,我们用指定值做加权平均数。 让我们来考虑一下图像对比度增强的问题。基本上我们要对图像的每一个像 素应用下面的公式: 上面那种表达法是公式的形式,而下面那种是以掩码矩阵表示的紧凑形式。 使用掩码矩阵的时候,我们先把矩阵中心的元素 (上面的例子中是(0,0)位置的元 素,也就是5)对齐到要计算的目标像素上,再把邻域像素值和相应的矩阵元素 值的乘积加起来。虽然这两种形式是完全等价的,但在大矩阵情况下,下面的形 式看起来会清楚得多。 现在,我们来看看实现掩码操作的两种方法。一种方法是用基本的像素访问 方法,另一种方法是用 filter2D 函数。 方法一、基本的像素访问方法: void Sharpen(const Mat myImage,Mat Result) { CV_Assert(myImage.depth()== CV_8U); // accept only uchar images const int nChannels = myImage.channels(); Result.create(myImage.size(),myImage.type()); for(int j = 1 ; j myImage.rows-1; ++j) { const uchar* previous = myImage.ptruchar(j - 1); const uchar* current = myImage.ptruchar(j ); const uchar* next = myImage.ptruchar(j + 1); uchar* output = Result.ptruchar(j); for(int i= nChannels;i nChannels*(myImage.cols-1); ++i) { *output++ = saturate_castuchar(5*current[i] -current[i-nChannels] - current[i+nChannels] - previous[i] - next[i]); } } Result.row(0).setTo(Scalar(0)); Result.row(Result.rows-1).setTo(Scalar(0)); Result.col(0).setTo(Scalar(0)); Result.col(Result.cols-1).setTo(Scalar(0)); } 首先,我们确保输入图像数据是无符号字符格式。为此,我们使用 cv::CV_Assert函数,当它的表达式为假时,抛出一个错误。 CV_Assert(myImage.depth()== CV_8U); // accept only uchar images 我们创建一个和输入图像同样大小和同样类型的输出图像。根据通道数我们 可能有一个或多个子列。我们将通过指针来遍历输入图像。 const int nChannels = myImage.channels(); Result.create(myImage.size(),myImage.type()); 我们将使用C中的[]操作符来访问每一个像素。因为我们需要同时使用多行, 因此我们将获得每一行的指针 (前一行,当前行,后一行),我们需要另外一个 指针来保存我们的计算结果。然后使用[]就可以简单地访问每一个元素了。在每 一次操作之后都要移动输出指针指向下一位。 for(int j = 1 ; j myImage.rows-1; ++j) { const uchar* previous = myImage.ptruchar(j - 1); const uchar* current = myImage.ptruchar(j ); const uchar* next = myImage.ptruchar(j + 1); uchar* output = Result.ptruc

文档评论(0)

xyl118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档