这里我们要细分了,虽然GxG_xGx​是对x求偏导得到,但是它反映的是在x方向上的三个像素值差异很大,那么假设黑色图像中一条白色竖线(有10行1列),那么卷积后:

  • 在白色竖线以外左边相邻的那一列,他的GxG_xGx​值都很大,最大为255(超过255的被赋值为255);
  • 在白色竖线的每一点,他的GxG_xGx​值都为0;
  • 在白色竖线以外右边相邻的那一列,他的GxG_xGx​值都为很大负数,会被赋值为0.
    即,通过计算GxG_xGx​,可以知道这三列形成了一条白色竖线。所以GxG_xGx​是用来检测竖直边缘的
    同理,GyG_yGy​是对y求偏导,它反映的是在y方向上的三个像素值差异很大,但是它是用来检测水平边缘的。

#include <math.h>#include <iostream>
#include <string>
#include <vector>#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
// g++ test.cpp `pkg-config opencv --libs --cflags` -std=c++11 -pthread -o testint main() {cv::Mat src = cv::Mat::zeros(500, 500, CV_8UC1);cv::Mat dst = cv::Mat::zeros(500, 500, CV_8UC1);for (int y = 0; y < src.rows; ++y) {src.at<unsigned char>(y, 250) = 255;}for (int x = 0; x < src.cols; ++x) {src.at<unsigned char>(250, x) = 255;}// cv::Mat src = cv::imread("pppp.png");// cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);// cv::Mat dst = src.clone();cv::imshow("Image of src", src);cv::Mat kernel_x = (cv::Mat_<char>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);cv::Mat kernel_y = (cv::Mat_<char>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);cv::Mat dst_x, dst_y;cv::filter2D(src, dst_x, CV_8UC3, kernel_x);cv::filter2D(src, dst_y, CV_8UC3, kernel_y);cv::imshow("Image of sobel x", dst_x);cv::imshow("Image of sobel y", dst_y);cv::imshow("Image of sobel x+y", dst_x + dst_y);//梯度for (int i = 0; i < dst_x.cols; ++i) {for (int j = 0; j < dst_x.rows; ++j) {dst.at<uchar>(j, i) = std::sqrt(std::pow(dst_x.at<uchar>(j, i), 2) +std::pow(dst_y.at<uchar>(j, i), 2));}}cv::imshow("Image of sobel 梯度", dst);while (cv::waitKey(0) != 'q') {};return 0;
}

原始图:

通过GxG_xGx​计算得到:

通过GyG_yGy​计算得到:

通过Gx+GyG_x+G_yGx​+Gy​计算得到:


通过Gx2+Gy2{G_x}^2+{G_y}^2Gx​2+Gy​2计算梯度得到:

#include <iostream>
#include <string>
#include <vector>#include "opencv2/highgui/highgui.hpp"
#include "opencv2/opencv.hpp"
// g++ test.cpp `pkg-config opencv --libs --cflags` -std=c++11 -pthread -o testint main() {cv::Mat src = cv::imread("pppp.png");cv::cvtColor(src, src, cv::COLOR_BGR2GRAY);cv::Mat dst = src.clone();cv::imshow("Image of src", src);cv::Mat kernel_x = (cv::Mat_<char>(3, 3) << -1, 0, 1, -2, 0, 2, -1, 0, 1);cv::Mat kernel_y = (cv::Mat_<char>(3, 3) << -1, -2, -1, 0, 0, 0, 1, 2, 1);cv::Mat dst_x, dst_y;cv::filter2D(src, dst_x, CV_8UC3, kernel_x);cv::filter2D(src, dst_y, CV_8UC3, kernel_y);cv::imshow("Image of sobel x", dst_x);cv::imshow("Image of sobel y", dst_y);cv::imshow("Image of sobel x+y", dst_x + dst_y);//梯度for (int i = 0; i < dst_x.cols; ++i) {for (int j = 0; j < dst_x.rows; ++j) {dst.at<uchar>(j, i) = std::sqrt(std::pow(dst_x.at<uchar>(j, i), 2) +std::pow(dst_y.at<uchar>(j, i), 2));}}cv::imshow("Image of sobel 梯度", dst);while (cv::waitKey(0) != 'q') {};return 0;
}

origin:

sobel−xsobel-xsobel−x:

sobel−ysobel-ysobel−y:

sobel x+yx+yx+y :

通过Gx2+Gy2{G_x}^2+{G_y}^2Gx​2+Gy​2计算梯度得到:

【opencv】26.图像水平边缘和竖直边缘的算子数学分析相关推荐

  1. 图像水平梯度和竖直梯度代码_Opencv图像处理(三)

    晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...

  2. 图像水平梯度和竖直梯度代码_20行代码发一篇NeurIPS:梯度共享已经不安全了

    整理 | 夕颜,Jane 出品 | AI科技大本营(ID:rgznai100) [导读]12 月 8 日-14 日,NeurIPS 2019 在加拿大温哥华举行,和往常一样,今年大会吸引了数万名专家参 ...

  3. OPENCV(四)对图像进行水平投影和竖直投影

    本篇博客讲述如何使用python的openCV库实现对图像的水平投影和竖直投影: 关键代码如下: import cv2#读取图片 image1 = cv2.imread('../img/123.png ...

  4. 水平方向的算子检测竖直边缘理解

    -1  0  1 -1  0  1 -1  0  1 这种算子称为水平方向的算子. 是因为利用它可以检测出图像在水平方向上两侧是否存在差异 如果在水平方向上存在差异则可能是竖直边缘

  5. 利用sobel算子提取图像的水平特征和竖直特征

    一. sobel滤波器介绍 sobel滤波器常用来提取灰度图像的水平边缘(水平特征)和竖直边缘(竖直特征) 二. sobel算子    纵向算子,提取图像水平边缘 ↑ 横向算子,提取图像竖直边缘 ↑ ...

  6. OpenCV中图像水平拼接函数hconcat的使用

    OPenCV版本:4.4 IDE:VS2019 功能描述 对给定的矩阵应用进行水平连接. 函数垂直连接两个或更多的cv::Mat矩阵 (具有相同的行数). 函数原型1 CV_EXPORTS void ...

  7. 用xml画水平虚线和竖直虚线.md

    1.画水平虚线 直接建一个shape,设置stroke属性就行了,再将这个属性直接作为background的drawable属性引入就行了 注意在4.0以上的真机加一句 <?xml versio ...

  8. 自定义Imageview控件实现多种手势操作 (拖动、水平缩放、竖直缩放、等比例缩放、双击、长按)

    项目中需要使用自定义控件的多种手势操作,之前在网上查阅资料的时候发现能找到的一般是只实现了其中的几种,这次就把我做的控件分享一下,人人为我,我为人人嘛,哈哈! 这个自定义控件实现的主要功能是控件的拖动 ...

  9. android 横向虚线,Android实现水平虚线和竖直虚线

    水平虚线 android:shape="line"> android:width="1dp" android:color="#747474&qu ...

最新文章

  1. python使用教程pandas-「Python」pandas入门教程
  2. SparkSql常用命令操作
  3. PostgreSQL SystemTap on Linux 转
  4. 子类super调用父类函数,该函数中调用的函数是父类还子类呢
  5. 【知识图谱】知识抽取与挖掘(I)
  6. Java的值传递和引用值传递的区别
  7. 同步器之Exchanger
  8. C++——OOP(Object-Oriented Programming) vs. GP(Generic Programming)
  9. android设置高德的3d,高德地图3D版的使用方法
  10. 数据库表多维度数据的计算和汇总
  11. android adb复制粘贴工具
  12. [个人备忘]SpringMVC+Mybatis+freemarker后台代码生成器自动生成新建表格数据的增删改查处理
  13. 【TeeChart .NET教程】(六)使用系列
  14. java在线编译器手机版,java编译器手机版下载
  15. 16款最佳的 jQuery Time Picker 时间选择插件
  16. 群晖Nas通过jellyfin搭建本地影音库详细全过程(一):通过群晖系统docker容器安装jellyfin影音库服务器
  17. 在java中定义一个字符串类型的变量str的语句是:( )._JAVA复习题
  18. IT行业的发展前景分析
  19. 一次人大金仓剔除锁经历
  20. 基于matlab的手写体数字识别系统,基于matlab的手写体数字识别系统研究

热门文章

  1. java set转list,数组与list的转换
  2. ubuntu 18.04 安装nodejs
  3. 你能活多少岁,就让人工智能来告诉你吧
  4. 官方乌镇定调互联网金融,P2P、众筹专项对待
  5. Docker Review - docker images 常用命令
  6. 深入理解分布式技术 - 从区块链技术看分布式理论的应用
  7. Redis-09Redis的基础事务
  8. Java-Java I/O流解读之基于字符的I / O和字符流
  9. 基础JavaScript_Day01
  10. oracle 12c创建归档,实测创建 Oracle 12C Dataguard