OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Laplace边缘检测和Sobel边缘检测,图像重映射)

本系列学习笔记参考自OpenCV2.4.10之opencv\sources\samples\cpp\tutorial_code和http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html

在图像处理中,往往需要对图像提取有效的边缘。本博文将介绍Laplace边缘检测和Sobel边缘检测,以及图像的重映射。

1.Laplace_Demo.cpp(Laplace边缘检测)

Demo源码及注释如下:

#include "stdafx.h"    //预编译头文件    

/**
Laplace变换检测边缘
 */

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/**
 *主函数
 */
int main( int, char** argv )
{

  Mat src, src_gray, dst;
  int kernel_size = 3;
  int scale = 1;
  int delta = 0;
  int ddepth = CV_16S;
  const char* window_name = "Laplace Demo";

  ///载入图片
  src = imread("D:\\opencv\\lena.png");

  if( !src.data )
    { return -1; }

  ///高斯滤波器进行模糊进而去除噪声
  GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );

  ///将图像转换为灰度图
  cvtColor( src, src_gray, COLOR_RGB2GRAY );

  ///创建窗口
  namedWindow( window_name, WINDOW_AUTOSIZE );

  Mat abs_dst;
  ///Laplace变换
  Laplacian( src_gray, dst, ddepth, kernel_size, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( dst, abs_dst );

  ///显示
  imshow( window_name, abs_dst );

  waitKey(0);

  return 0;
}

运行截图:

函数Laplacian用于计算图像的Laplace边缘,函数原型为:C++: void Laplacian(InputArray src,
OutputArray dst, int ddepth,
int ksize=1, double scale=1,
double delta=0, int borderType=BORDER_DEFAULT)参数src为灰度图,dst为与src大小相同,类型相同的Laplace边缘检测后的图像,ddepth用于描述图像的位深,ksize用于计算二阶导数滤波器的孔径大小,其值为奇数。scale为计算拉普拉斯值可选比例因子。delta为叠加在dst上的可选常量值。

2.Sobel_Demo.cpp(Sobel边缘检测)

demo源码及注释如下:

#include "stdafx.h"    //预编译头文件    

/**
Sobel边缘检测Demo
 */

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>

using namespace cv;

/**
 * 主函数
 */
int main( int, char** argv )
{

  Mat src, src_gray;
  Mat grad;
  const char* window_name = "Sobel Demo - Simple Edge Detector";
  int scale = 1;
  int delta = 0;
  int ddepth = CV_16S;

  ///载入图片
  src = imread("D:\\opencv\\lena.png");

  if( !src.data )
    { return -1; }

  GaussianBlur( src, src, Size(3,3), 0, 0, BORDER_DEFAULT );

  ///转换为灰度图
  cvtColor( src, src_gray, COLOR_RGB2GRAY );

  ///创建窗口
  namedWindow( window_name, WINDOW_AUTOSIZE );

  Mat grad_x, grad_y;
  Mat abs_grad_x, abs_grad_y;

  ///X方向的梯度边缘
  Sobel( src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( grad_x, abs_grad_x );

  //Y方向的梯度边缘
  Sobel( src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
  convertScaleAbs( grad_y, abs_grad_y );

  ///图像总体边缘
  addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad );

  imshow( window_name, grad );

  waitKey(0);

  return 0;
}

运行截图:

Sobel函数的功能为通过Sobel算子计算 图像边缘,其函数声明为:C++: void Sobel(InputArray src,
OutputArray dst, int ddepth,
int xorder, int yorder,
int ksize=3, double scale=1,
double delta=0, intborderType=BORDER_DEFAULT )
第一个参数src为输入图像,dst为输出图像,ddepth为输出图像位深,xorder与yorder分别为x方向与y方向的导数的阶数,ksize为sobel算子的大小,该值必须为奇数。

3.Remap_Demo.cpp(图像重映射)

demo源码及注释如下:

#include "stdafx.h"    //预编译头文件    

/**
图像重映射Demo
 */

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>

using namespace cv;

///全局变量
Mat src, dst;
Mat map_x, map_y;
const char* remap_window = "Remap demo";
int ind = 0;

///函数声明
void update_map( void );

/**
 * 主函数
 */
int main( int, char** argv )
{
  ///加载图片
  src = imread("D:\\opencv\\lena.png", 1 );

  ///创建于src图像大小小童的dst,map_x,map_y
  dst.create( src.size(), src.type() );
  map_x.create( src.size(), CV_32FC1 );
  map_y.create( src.size(), CV_32FC1 );

  ///创建窗口
  namedWindow( remap_window, WINDOW_AUTOSIZE );

  ///循环
  for(;;)
  {
    int c = waitKey( 1000 );

    if( (char)c == 27 )
      { break; }

    ///重映射
    update_map();
    remap( src, dst, map_x, map_y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0) );

    //显示结果
    imshow( remap_window, dst );
  }
  return 0;
}

/**
 * 四种类型的重映射
 */
void update_map( void )
{
  ind = ind%4;

  for( int j = 0; j < src.rows; j++ )
    { for( int i = 0; i < src.cols; i++ )
     {
           switch( ind )
         {
         case 0: //高度缩小一半,并显示在中间
           if( i > src.cols*0.25 && i < src.cols*0.75 && j > src.rows*0.25 && j < src.rows*0.75 )
                 {
               map_x.at<float>(j,i) = 2*( i - src.cols*0.25f ) + 0.5f ;
               map_y.at<float>(j,i) = 2*( j - src.rows*0.25f ) + 0.5f ;
              }
           else
         { map_x.at<float>(j,i) = 0 ;
               map_y.at<float>(j,i) = 0 ;
                 }
                   break;
         case 1:  //图像上下颠倒
               map_x.at<float>(j,i) = (float)i ;
               map_y.at<float>(j,i) = (float)(src.rows - j) ;
           break;
             case 2://图像左右颠倒
               map_x.at<float>(j,i) = (float)(src.cols - i) ;
               map_y.at<float>(j,i) = (float)j ;
           break;
             case 3://图像上下颠倒的同时左右颠倒
               map_x.at<float>(j,i) = (float)(src.cols - i) ;
               map_y.at<float>(j,i) = (float)(src.rows - j) ;
           break;
             }
     }
    }
  ind++;
}

运行截图如下:

remap的功能是实现图像的重映射。映射关系为:

函数原型为:C++: void remap(InputArray src,
OutputArray dst, InputArray map1,
InputArray map2, int interpolation,
int borderMode=BORDER_CONSTANT, const Scalar& borderValue=Scalar())其中src为源图像,dst为目的图像。map1为x方向的映射关系,map2为y方向的映射关系。interpolation为插值方式。

时间: 2024-08-24 03:02:24

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(Laplace边缘检测和Sobel边缘检测,图像重映射)的相关文章

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(仿射变换)

本系列学习笔记参考自OpenCV2.4.10之opencv\sources\samples\cpp\tutorial_code和http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html 本博文将继续学习opencv-tutorial-code中的ImgTrans,这里讲主要介绍仿射变换.仿射变换是直角坐标系的一种,描述的是一幅图到另外一幅图的变换关系.它代表的是一幅图乘以一个向量再加上一个向量的变换.仿射变换保持平直性和平行性,其中平

win8.1 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建

win8.1 + VS2010 + OpenCV2.4.10重编译OpenCV开发环境搭建 重编译的好处:可以调试的时候看OpenCV的源代码. 重编译要得到的东西:Debug版本和Release版本的dll,lib,头文件.(dll添加到环境变量里,运行时用,自己编译的dll调试时可以跟踪到Opencv的源码内:lib和头文件配置到编译器里) PS:如果只是使用Opencv而不需要跟踪源码,则使用Opencv自带的库文件即可.跳到5配置Opencv开发环境,对应的文件都在..\opencv\b

Linux Ubuntu下安装OpenCv2.4.10

参考 http://blog.sina.com.cn/s/blog_53b0956801010lfu.html 捣鼓了一个晚上了,OpenCv还没装好,本来以为看个类似的比如Ubuntu安装OpenCv2.2或者其他的就能安装好,结果发现...我太天真了. 网上使用Ubuntu12.04来装OpenCv还是挺多的,各种版本组合教程,都没能把我的Ubuntu12.04+OpenCv2.4.10 成功合体. 灰心之极到OpenCv官网想下载个OpenCv2.4.0发现没有.... 只好假装屡败屡战了

OpenCV2.4.10 + VS2010开发环境配置

原文转载自:qinyang8513 一.开发环境 1.操作系统:Windows 7(64位) 2.编程环境:Microsoft Visual Studio 2010 3.OpenCV版本:2.4.10 二.安装OpenCV2.4.10 1.下载OpenCV2.4.10 SDK:官网链接为:http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.4.10/opencv-2.4.10.exe/download 2.安装open

VS2010和opencv-2.4.10、GDAL

系统环境:win10 64位 本文内容为博主原创,转载请注明http://www.cnblogs.com/mxbs/p/6206060.html       2016-12-21 配置OpenCV 第一步:配置之前的准备工作. 完成VS2010的安装,以及opencv-2.4.10的下载和文件提取, 双击此文件,设置文件路径,即可得到提取文件,提取后的文件以OpenCV命名. 第二步:配置系统环境变量. 右击"计算机"->"属性"->"高级系统

win7_64bit+VS2013+CUDA7.5+Opencv2.4.10配置Caffe环境

参考博客: 1.win7环境下CUDA7.5的安装.配置与测试(VS2010) 2.Win7_64bit + VS2013 + CUDA7.5 + Opencv2.4.10 成功配置Caffe环境 注意事项: 1.CUDA的用处:目前随着硬件技术的进步,常使用GPU(Graphics Processing Unit,图形处理器)来进行神经网络算法的训练及实现.GPU计算的基础是Nvidia的CUDA环境. 2.Caffe的主版本(caffe-master)只支持Linux,所以要下载专门的caf

MinGW+CMake编译Opencv2.4.10

安装MinGW 下载地址:http://www.mingw.org 安装:运行mingw-get-setup.exe 选择安装mingw32-base   mingw32-gcc-g++ 将mingw的bin目录添加到环境变量 安装CMake 下载地址:http://www.cmake.org 安装:双击cmake-3.0.2-win32-x86.exe进行安装 安装OpenCV2.4.10 下载地址:http://opencv.org/downloads.html 安装:双击opencv-2.

在MAC OSX10.10上安装OpenCV2.4.10全过程(含Homwbrew,cmake安装,在XCode6.1.1上配置OpenCV2.4.10)

首先交代下安装环境MAC OSX10.10,安装版本为OpenCV2.4.10,Xcode的版本为6.1.1,基本上都是各个软件的最新版本.因为OpenCV3.0还在测试阶段,正式版本没有发布,所以没用3.0.下面详细介绍安装步骤: 一,安装Homebrew Homebrew类似Ubuntu的apt-get,Fedora的yum,简单来说就是为了方便安装软件而生的.打开Homebrew官方网站http://brew.sh/index_zh-cn.html,找到安装homebrew的ruby命令:

OpenCV2.4.10之samples_cpp_tutorial-code_learn-----ImgTrans(图片边框与图片卷积)

本系列学习笔记参考自OpenCV2.4.10之 opencv\sources\samples\cpp\tutorial_code和 http://www.opencv.org.cn/opencvdoc/2.3.2/html/genindex.html 本博文将继续介绍如何给一张图片添加边框以及如何对一张图片进行卷积.核心函数为copyMakeBorder与filter2D 1.copyMakeBorder_demo.cpp(图片边框) 源码如下: #include "stdafx.h"