http://www.cnblogs.com/liu-jun/archive/2012/08/12/2635373.html-程序员宅基地

技术标签: 3.0  opencv  

利用拉普拉斯算子进行图像锐化是数字图像处理里比较简单的处理手段,下面的例子参考opencv 2 computer vision application programming cookbook,采用两种方法对输入图像进行拉普拉斯锐化,原理比较简单,故不赘述了。

编译环境:VS2010+OpenCV2.3.1

编程细节:

  • 函数的形参表中,为了防止修改输入图像image,故形参传递为pass by conference-const,同时函数体中指向输入图像的指针也必须声明为指向const对象的指针,如const uchar *next = image.ptr<const uchar>(j);
  • cv::Mat::row()返回由单行或者单列组成的特定的cv::Mat实例,cv::Scalar(a,b,c)指定每个通道的特定值;
  • 第二种方法中,利用函数cv::filter2D(),需先创建一个核cv::Mat,并对核进行初始化。

code:

按 Ctrl+C 复制代码
/***************************************************************
*
*   内容摘要:分别用两种方法对输入图像进行拉普拉斯算子锐化,并比较
*             两种方法的执行效率,从运行结果来看,第二种方法的效率
*             更高。
*   作    者:刘军(Jacky Liu)
*   完成日期:2012.8.12
*   参考资料:opencv 2 computer vision application programming 
*            cookbook
*
***************************************************************/


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>


//输入形参为pass by conference-const,保证输入的图像不会被修改,并且为传递引用
void sharpenImage0(const cv::Mat &image, cv::Mat &result)
{
    //为输出图像分配内存
    result.create(image.size(),image.type());
    
    /*滤波核为拉普拉斯核3x3:
                             0 -1 0
                            -1 5 -1
                             0 -1 0   
    */
    for(int j= 1; j<image.rows-1; ++j)
    {
        const uchar *previous = image.ptr<const uchar>(j-1);
        const uchar *current = image.ptr<const uchar>(j);
        const uchar *next = image.ptr<const uchar>(j+1);
        uchar *output = result.ptr<uchar>(j);
        for(int i= 1; i<image.cols-1; ++i)
        {
            *output++ = cv::saturate_cast<uchar>(5*current[i]-previous[i]-next[i]-current[i-1]-current[i+1]);  //saturate_cast<uchar>()保证结果在uchar范围内
        }
    }
    result.row(0).setTo(cv::Scalar(0));
    result.row(result.rows-1).setTo(cv::Scalar(0));
    result.col(0).setTo(cv::Scalar(0));
    result.col(result.cols-1).setTo(cv::Scalar(0));
}


void sharpenImage1(const cv::Mat &image, cv::Mat &result)
{
    //创建并初始化滤波模板
    cv::Mat kernel(3,3,CV_32F,cv::Scalar(0));
    kernel.at<float>(1,1) = 5.0;
    kernel.at<float>(0,1) = -1.0;
    kernel.at<float>(1,0) = -1.0;
    kernel.at<float>(1,2) = -1.0;
    kernel.at<float>(2,1) = -1.0;


    result.create(image.size(),image.type());
    
    //对图像进行滤波
    cv::filter2D(image,result,image.depth(),kernel);
}


int main(int argc, char* argv[])
{
    cv::Mat image = cv::imread("../boldt.jpg");
    cv::Mat image_gray;
    image_gray.create(image.size(),image.type());


    if(!image.data)
        return -1;
    if(image.channels() == 3)
        cv::cvtColor(image,image_gray,CV_RGB2GRAY);


    cv::Mat result;
    result.create(image_gray.size(),image_gray.type());
    double time_ = static_cast<double>(cv::getTickCount());
    sharpenImage0(image_gray,result);
    time_ = 1000*(static_cast<double>(cv::getTickCount())-time_)/cv::getTickFrequency();
    std::cout<<"time = "<<time_<<"ms"<<std::endl;


    cv::namedWindow("Image 1");
    cv::imshow("Image 1",result);


    cv::Mat result1;
    result1.create(image_gray.size(),image_gray.type());
    time_ = static_cast<double>(cv::getTickCount());
    sharpenImage1(image_gray,result1);
    time_ = 1000*static_cast<double>(cv::getTickCount()-time_)/cv::getTickFrequency();
    std::cout<<"time = "<<time_<<"ms"<<std::endl;


    cv::namedWindow("Image 2");
    cv::imshow("Image 2",result1);


    cv::waitKey();
    return 0;
}
按 Ctrl+C 复制代码

 

运行结果:从运行结果来看,两种方法得出的效果基本一样。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u014003644/article/details/69053715

智能推荐

(python)正则表达式提取字符串中的各种信息(持续更新)_正则表达式 获取所有内容(1)-程序员宅基地

文章浏览阅读275次,点赞4次,收藏6次。前两位数字代表省级行政区,中间两位数字代表市级行政区,后两位数字代表县级行政区、县市辖区或直辖市的行政区划。手机号码有自己特定的特征,比如1开头,手机号码长度 11位,一般来说,中国的邮政编码由6位数字组成。省级行政区 市级行政区 县级行政区。不同运营商的号段分布。

方舟编译器最新技术细节,2024年最新简短的面试总结-程序员宅基地

文章浏览阅读217次,点赞5次,收藏3次。希望本文对你有所启发,有任何面试上的建议也欢迎留言分享给大家。好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。好了~如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。

李宏毅机器学习课程笔记——回归_李宏毅机器学习中回归课堂笔记-程序员宅基地

文章浏览阅读259次。1、回归是什么回归(Regression) 就是找到一个函数 function,通过输入特征 x,输出一个数值 Scalar。比较像我们常见的函数拟合。2、回归的步骤step1:模型假设,选择模型框架step2:模型评估,如何判断众多模型的好坏(损失函数)step3:模型优化,如何筛选最优的模型(梯度下降)下面以李宏毅老师的课程中的宝可梦能力值的例子来对每个步骤进行分析。2.1 模型选择这里我们都选择线性模型进行分析。2.1.1 单个特征当选取单个特征时,以特征xcpx_{cp}x_李宏毅机器学习中回归课堂笔记

HOG算法及其改进 (附代码)_hog算法代码-程序员宅基地

文章浏览阅读1.2k次,点赞30次,收藏25次。HOG算法及其改进_hog算法代码

RAC 更改主机名及IP地址_crsctl pin css -n-程序员宅基地

文章浏览阅读1.9k次。由于安装RAC时脚本执行顺序错了,导致实例orcl1装到了rac2节点上,orcl2装到了rac1节点上,看起来很别扭,趁这个机会练习下更改主机名和IP地址。原IP及主机名设置:#public IP172.12.1.11 rac1.oracle.com rac1172.12.1.12 rac2.oracle.com rac2#private IP10.10.10.1 rac1_crsctl pin css -n

吴恩达2022机器学习专项课程(一) 1.2 机器学习的应用-程序员宅基地

文章浏览阅读328次,点赞9次,收藏4次。课程将教授哪些内容?为什么机器学习如此重要?机器学习算法的实际应用有哪些?如何提升机器学习算法的性能?人工智能和机器学习的未来趋势是什么?为什么现在是学习机器学习的好时机?

随便推点

VUE实现网页中滚动鼠标时导航背景颜色透明度的改变_vue可以监听鼠标滚轮滑动,导航条透明度变化-程序员宅基地

文章浏览阅读2.9k次,点赞11次,收藏28次。1、HTML<div id="topNav" :style="topNavBg"> 这里是导航内容</div>2、JSexport default { data () { return { topNavBg: { backgroundColor: '' } } }, mounted () { window.addEventListener('scroll', this.handleScroll) // 监听_vue可以监听鼠标滚轮滑动,导航条透明度变化

【数据结构】单链表-练习_设 l 为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值-程序员宅基地

文章浏览阅读191次。2. 每当访问一个结点时,先递归输出它后面的结点,再输出该结点自身,这样链表就反向输出了。2. 将上述单链表中的元素按从头到尾的顺序,使用头插法新建一个链表 reverse;【题目】设 L 为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值。3. 打印输出 reverse 中的元素。【思路】 1. 尾插法建立单链表 L;【答案】 1. 建立一个单链表;_设 l 为带头结点的单链表,编写算法实现从尾到头反向输出每个结点的值

(一) ansible (架构,安装,java代理模式面试题-程序员宅基地

文章浏览阅读982次,点赞15次,收藏12次。其它面试题(springboot、mybatis、并发、java中高级面试总结等)既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)

dB(分贝)定义及其应用(音量 dB dBA 计算 调整)-程序员宅基地

文章浏览阅读7.5k次,点赞7次,收藏18次。音量 分贝 dB dBA 计算 调整理解dB的第一个要点,就是要知道它是表示两个具有相同单位的同一种物理量的相对关系。即两种电或声功率之比,或两种电压或电流值或类似声量之比。它还是一种测量声音相对响度的单位。最初在电话工程领域,dB是用于定义于表示两个功率比,是P1/P0的比值再取以10为底的对数,再乘以10,其数学式为:dB是一个比值,是一个数值,是一个纯计数方法,没有任何单位标注。由于它在不同领域有着不同的名称,因此它也代表不同的实际意义。常见的领域有:声音、信号、增益等。_db

url中%E6%98转换为中文-程序员宅基地

文章浏览阅读1.8k次。通过parse.unquote()方法进行解码,把 URL编码字符串,转换回原先字符串import urllibdata=urllib.parse.unquote(data)_%e6%b8%b8%e7%88%b1%e7%bd%91%e7%bb%9c 转中文

从C语言来理解文件系统_c语言 fgets与while结合(1),洞悉MySQL底层架构-程序员宅基地

文章浏览阅读982次,点赞24次,收藏19次。因此,可以约定一个更节省空间的格式来表示一个 256 色的图像,此种文件格式的描述如下:文件中的第 0 和第 1 个字节是整数 n,代表图像的宽度(2 字节的 n 的取值范围是 0~65 535,说明图像最多只能是 65 535 个像素宽),第 2 和第 3 个字节代表图像的高度。上面的箭头表示的区域就相当是一个输入流,红色的地方相当于一个开关,这个开关可以控制往深绿色区域(标注的是缓冲区)里放进去的数据,输入20个字节的数据只往缓冲区中放进去了10个字节,剩下的10个字节的数据就被停留在了输入流里!