(转)Opencv卷积操作

转自:http://www.2cto.com/kf/201312/267308.html

Mask Operation filter2D函数 Last Edit 2013/12/24 所谓的Mask Operation就是滤波。 第一步:建立Mask:

?


1

2

3

Mat kern = (Mat_<char>(3,3) <<  0, -10,

                               -15, -1,

                                0, -10);</char>

Mat_是一个模板,建立了一个3*3的矩阵,矩阵的值在-128~127. 
第二步:使用filter2D. 函数原型:

?


1

2

3

4

5

6

7

8

void filter2D(InputArray src, //要进行滤波的图像

              OutputArray dst,//滤波后的图像

              int ddepth,     //原图像的深度  src.depth()

              InputArray kernel, //第一步建立的Mask

              Point anchor=Point(-1,-1),//Mask的中心点

              double delta=0, //Optional value added to the filtered pixels before storing them in dst

              int borderType=BORDER_DEFAULT

               )

?


1

filter2D(I, K, I.depth(), kern );

以下是OpenCV2.0提供的sample:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

#include <opencv2 core="" core.hpp="">

#include <opencv2 highgui="" highgui.hpp="">

#include <opencv2 imgproc="" imgproc.hpp="">

#include <iostream>

using namespace std;

using namespace cv;

void help(char* progName)

{

    cout << endl

        <<  "This program shows how to filter images with mask: the write it yourself and the"

        << "filter2d way. " << endl

        <<  "Usage:"                                                                        << endl

        << progName << " [image_name -- default lena.jpg] [G -- grayscale] "        << endl << endl;

}

void Sharpen(const Mat& myImage,Mat& Result);

int main( int argc, char* argv[])

{

    help(argv[0]);

    const char* filename = argc >=2 ? argv[1] : "lena.jpg";

    Mat I, J, K;

    if (argc >= 3 && !strcmp("G", argv[2]))

        I = imread( filename, CV_LOAD_IMAGE_GRAYSCALE);

    else

        I = imread( filename, CV_LOAD_IMAGE_COLOR);

    namedWindow("Input", CV_WINDOW_AUTOSIZE);

    namedWindow("Output", CV_WINDOW_AUTOSIZE);

    imshow("Input", I);

    double t = (double)getTickCount();

    

    Sharpen(I, J);

    

    t = ((double)getTickCount() - t)/getTickFrequency();

    cout << "Hand written function times passed in seconds: " << t << endl;

    imshow("Output", J);

    cvWaitKey(0);

    Mat kern = (Mat_<char>(3,3) <<  0, -10,

                                   -15, -1,

                                    0, -10);

    t = (double)getTickCount();

    filter2D(I, K, I.depth(), kern );

    t = ((double)getTickCount() - t)/getTickFrequency();

    cout << "Built-in filter2D time passed in seconds:      " << t << endl;

    imshow("Output", K);

    cvWaitKey(0);

    return 0;

}

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.ptr<uchar>(j - 1);

        const uchar* current  = myImage.ptr<uchar>(j    );

        const uchar* next     = myImage.ptr<uchar>(j + 1);

        uchar* output = Result.ptr<uchar>(j);

        for(int i= nChannels;i < nChannels*(myImage.cols-1); ++i)

        {

            *output++ = saturate_cast<uchar>(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));

}</uchar></uchar></uchar></uchar></uchar></char></iostream></opencv2></o

时间: 2024-10-13 13:32:07

(转)Opencv卷积操作的相关文章

OpenCV &mdash;&mdash; 矩阵操作

多通道的矩阵 -- 通道是连续的!! 要将指向该数据类型的指针移动到下一通道,我们只需要将其增加1.如果想访问下一个"像素"或者元素集,则需要一定的偏移量 矩阵的step元素是矩阵中行的长度,单位为字节.   #include "cv.h" #include "highgui.h" #include <IOSTREAM.H> int main(int argc,char** argv) { float vals[]={0.85,-0.

卷积操作的GPU粗粒度并行实现及测试

一.    算法基本思想: 1.           GPU中的一个线程产生一个卷积结果,有多少个结果就使用多少个Block; 2.           矩阵和卷积核存放在共享内存中,卷积结果存放在全局内存中: 3.           支持10000以内任意维度的二维矩阵,卷积核最大支持16x16. 4.           支持任意多幅图像的批处理. 二.    实验平台: CPU:Intel(R) Xeon(R) E5-2650 0 @2.00GHz 16核 32线程 GPU:NVIDIA

卷积操作的GPU粗粒度并行实现及测试(优化)

A.边界扩展: B.字块对齐. Matrix Size Number Kernel CPU(s) CPU2GPU GPU-Kernel GPU2CPU 5x4 1 5x4 <1ms <1ms <1ms <1ms 12x9 1 5x4 <1ms <1ms <1ms <1ms 18x19 1 5x4 <1ms <1ms <1ms <1ms 118x29 1 5x4 <1ms <1ms <1ms <1ms 138x5

python——对图像进行卷积操作,使用多个滤波器

线性滤波可以说是图像处理最基本的方法,它可以允许我们对图像进行处理,产生很多不同的效果.做法很简单.首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像.然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值.这样就完成了滤波过程. 对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这个操作就叫卷积或者协相关.卷积和协相关的差别是,卷积需要先对滤波矩阵进行180的翻

卷积操作转化成矩阵乘法

参考:https://petewarden.com/2015/04/20/why-gemm-is-at-the-heart-of-deep-learning/ 平常都是无脑使用Pytorch提供的nn.Conv2d方法,但是并不关心具体该如何实现,原来是把卷积操作转化成矩阵乘法,而不是真的通过滑动卷积核来做卷积,下面做具体介绍. 首先看一下下面的示意图,左边是输入图像,右边是卷积核(为方便说明,只用了一个卷积核). 下面是用这个卷积核对输入图像做卷积操作,最后得到一个2维的平面 由下图可以看到卷

ICLR 2020 | 抛开卷积,multi-head self-attention能够表达任何卷积操作

近年来很多研究将nlp中的attention机制融入到视觉的研究中,得到很不错的结果,于是,论文侧重于从理论和实验去验证self-attention可以代替卷积网络独立进行类似卷积的操作,给self-attention在图像领域的应用奠定基础 论文: On the Relationship between Self-Attention and Convolutional Layers 论文地址:https://arxiv.org/abs/1911.03584 论文代码:https://githu

opencv图像卷积操作

代码: #include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; int main() { Mat src, dst, dst1; double t; //原图 src = imread(".//pic//test.jpg",IMREAD_UNCHANGED); if (src.empty()

OPENCV形态学操作1

形态学操作是指基于形状的一系列图像处理操作,包括膨胀,腐蚀,二值化,开运算,闭运算,顶帽算法,黑帽算法,形态学梯度等,最基本的形态学操作就是膨胀和腐蚀. 一.膨胀 首先需要明确一个概念,膨胀和腐蚀都是针对于图像中较亮的区域而言的,膨胀就是亮的区域变多了,而腐蚀就是暗的区域变多了. 膨胀的功能主要有消除噪声,分割出独立的图像元素,在图像操作的时候,有时候需要对图像中的某些形状进行检测,而这些形状相互连接在一起,不好分开检测,膨胀就能切开这些形状(很小的连接位置),或者图像中有很小块的黑斑,或许是相

OpenCV读写操作

OpenCV读取一副图片 imread( const String& filename, int flags = IMREAD_COLOR ); 参数1.文件名(路径与文件名,如果文件在目录中可以直接使用文件名即可) 参数2.读取方式 flags > 0  返回一个3通道的彩色图像 flags = 0  返回一个灰度图像 flags < 0  返回包含Alpha通道的加载图像 OpenCV写入一副图片 //如果目标文件夹内有同名文件则不执行任何操作, 包括下方的任何操作 imwrite