边缘检测算法4.-教你动手实现kirsch和robinson算子

还有很多 边缘检测算子,在OpenCV中没有实现代码。

所以,我们得掌握看懂算法,然后扩展 算法得能力。

比如,我已知的一些 边缘检测核心:

Kirsch 8方向算子

Robinson 8方向算子

这个时候,需要我们自己去实现这个算子。

这些算子的具体介绍,其实就是 用 8个核,进行8个方向卷积,然后选取 最大值做响应。

比如 实现 kirsch 算子

KLIB_DECL void edge_kirsch_all_direction(const Mat& grayImg, Mat& edgeImg, double scale = 1, double delta = 0) { edgeImg.create(grayImg.size(), CV_16S); edgeImg.setTo(0); ushort* pDst = (ushort*)edgeImg.data; uchar* pSrc = grayImg.data; int w = grayImg.cols; int h = grayImg.rows; vector<int> vals(8); for(int i = 1; i< h - 1; ++i) for (int j = 1; j < w - 1; ++j) { uchar v1 = pSrc[(i - 1)*w + j - 1]; uchar v2 = pSrc[(i - 1)*w + j]; uchar v3 = pSrc[(i - 1)*w + j + 1]; uchar v4 = pSrc[ i*w + j - 1]; uchar v6 = pSrc[ i*w + j + 1]; uchar v7 = pSrc[(i + 1)*w + j - 1]; uchar v8 = pSrc[(i + 1)*w + j]; uchar v9 = pSrc[(i + 1)*w + j + 1]; vals[0] = 5 * (v1 + v2 + v3) - 3 * (v4 + v6 + v7 + v8 + v9); vals[1] = 5 * (v6 + v2 + v3) - 3 * (v4 + v1 + v7 + v8 + v9); vals[2] = 5 * (v6 + v9 + v3) - 3 * (v4 + v1 + v7 + v8 + v2); vals[3] = 5 * (v6 + v9 + v8) - 3 * (v4 + v1 + v7 + v3 + v2); vals[4] = 5 * (v7 + v9 + v8) - 3 * (v4 + v1 + v6 + v3 + v2); vals[5] = 5 * (v7 + v4 + v8) - 3 * (v9 + v1 + v6 + v3 + v2); vals[6] = 5 * (v7 + v4 + v1) - 3 * (v9 + v8 + v6 + v3 + v2); vals[7] = 5 * (v2 + v4 + v1) - 3 * (v9 + v8 + v6 + v3 + v7); int maxV = *(std::max_element(vals.begin(), vals.end())); pDst[i*w + j] = scale * maxV + delta; }}

调用的方法:

调用 Kirsch算子

同理 实现 Robinson 算子:

KLIB_DECL void edge_robinson_all_direction(const Mat& grayImg, Mat& edgeImg, double scale = 1, double delta = 0){ edgeImg.create(grayImg.size(), CV_16S); edgeImg.setTo(0); ushort* pDst = (ushort*)edgeImg.data;  uchar* pSrc = grayImg.data; int w = grayImg.cols; int h = grayImg.rows; vector<int> vals(8); for (int i = 1; i < h - 1; ++i) for (int j = 1; j < w - 1; ++j) { uchar v1 = pSrc[(i - 1)*w + j - 1]; uchar v2 = pSrc[(i - 1)*w + j]; uchar v3 = pSrc[(i - 1)*w + j + 1]; uchar v4 = pSrc[i*w + j - 1]; uchar v6 = pSrc[i*w + j + 1]; uchar v7 = pSrc[(i + 1)*w + j - 1]; uchar v8 = pSrc[(i + 1)*w + j]; uchar v9 = pSrc[(i + 1)*w + j + 1]; vals[0] = 1 * (v1 + v3) + 2 * (v2 - v8) - 1 * (v7 + v9); vals[1] = 1 * (v2 + v6) + 2 * (v3 - v7) - 1 * (v4 + v8); vals[2] = 1 * (v3 + v9) + 2 * (v6 - v4) - 1 * (v1 + v7); vals[3] = 1 * (v6 + v8) + 2 * (v9 - v1) - 1 * (v2 + v4); vals[4] = 1 * (v7 + v9) + 2 * (v8 - v2) - 1 * (v1 + v3); vals[5] = 1 * (v4 + v8) + 2 * (v7 - v3) - 1 * (v2 + v6); vals[6] = 1 * (v1 + v7) + 2 * (v4 - v6) - 1 * (v3 + v9); vals[7] = 1 * (v2 + v4) + 2 * (v1 - v9) - 1 * (v8 + v6); int maxV = *(std::max_element(vals.begin(), vals.end())); pDst[i*w + j] = scale * maxV + delta; }}

调用的方法类似。

然后编译为一个 插件,加载到平台测试:

Krisch cast模式

Krisch abs模式

Krish nono模式

测试 Robinson算子,效果类似:

Robinson 算子 响应弱一些

这就是 其他人的博客里面 提到的 Kirsch 算子和 Robinson算子。

对比知道:

Laplace 边缘响应最弱

Sobel 边缘响应稍强

Robinson 边缘响应更强

Kirsch 边缘响应最强

希望大家学会了OpenCV之外的 边缘检测算子。

(0)

相关推荐

  • VALS GRAMOFON

    VALS GRAMOFON

  • python+opencv图像处理(四十二)

    Kirsch算子 1.Kirsch算子 Kirsch算子是R.Kirsch提出来一种边缘检测新算法,它采用8个模板对图像上的每一个像素点进行卷积求导数,这8个模板代表8个方向,对图像上的8个特定边缘方 ...

  • Kirsch樱桃酒是一种什么样的酒?品鉴Kirsch樱桃酒

    Kirsch樱桃酒是一种清澈的酒,它的名字在德语中的意思是"樱桃".它也被称为"Kirschwasser",意思是"樱桃水".由于这种酒与樱 ...

  • 抖音推荐算法!(教你如何上热门)

    [辰兮要努力]:hello你好我是辰兮,很高兴你能来阅读,昵称是希望自己能不断精进,向着优秀程序员前行! 博客来源于项目以及编程中遇到的问题总结,偶尔会有读书分享,我会陆续更新Java前端.后台.数据 ...

  • 什么是 Canny 边缘检测算法?

    重磅干货,第一时间送达 一.简介 Canny 边缘检测器是一种多步算法,用于检测任何输入图像的边缘.它涉及在检测图像边缘时要遵循的以下步骤. 1. 使用高斯滤波器去除输入图像中的噪声. 2.计算高斯滤 ...

  • 非必要不离开顺德!端午宅家里,顺德名厨教你动手做美食

    "得唔得,都留系顺德" 端午假期就地过节 非必要不离开顺德 宅家过节干什么好? 身在世界美食之都顺德 当然要用吃货的方式解决  和家人一起宅家做美食  参与#留在顺德过端午#话题互 ...

  • 超有创意的摩天轮绘画,不教孩子动手学习,那就亏大了!

    .... 注:图文转自:安小妮童画 作者:缨子 [准备材料:] 快递盒纸皮,剪刀,铅笔,樱花0.8号笔,油性马克笔,美术专用白乳胶,热熔胶,铆钉一个,图钉八个,彩泥少量,蓝色卡纸8开,白色卡纸,素描纸 ...

  • 边缘检测算法6.-Paillou边缘检测

    在 OpenCV扩展模块里面,有一个算法: paillou定义的 边缘检测 查资料,了解是 1997年 Paillou 提出来的 改进 SAR图像的 边缘检测方法. 论文在这个地方:https://i ...

  • 想吃炸鸡柳不用买,大厨教你动手做,色泽金黄,香酥可口

    想吃炸鸡柳不用买,大厨教你动手做,色泽金黄,香酥可口

  • 边缘检测算法2.-自定义差分算子

    边缘检测,根据原理,只要是计算像素差异,都能产生边缘检测效果. 我根据一些 实际情况,定义一种很简单的差分算子: 计算 核 Width x Height 的最大值 pMax 和最小值 pMin 计算 ...

  • 【博文连载】Sobel边缘检测算法的HDL实现

    FPGA中针对以上矩阵进行算法移植.由于直接计算会因为负值而得到错误的结果,用补码表示比较繁琐,需要用到unsigned 以及signed类型,不适合FPGA的运算. cnblog有真oo无双的代码, ...

  • 【博文连载】边缘检测算法介绍

    所谓边缘是指其周围像素灰度急剧变化的那些象素的集合,它是图像最基本的特征.边缘存在于目标.背景和区域之间,所以,它是图像分割所依赖的最重要的依据.由于边缘是位置的标志,对灰度的变化不敏感,,因此,边缘 ...