Opencv

首先,必须知道OpenCV用imread或者cvLoadImage得到的图像数据都是char类型的,至少2.x.x都是的,以后的不知道。

下面了解下结构体IplImage和类Mat中Widthstep和step的意义:

对于32位OS(64位是不是我不太清楚),内存读取图片数据是要满足每行数据4字节对齐的,也就是说如果图像是单通道char或者uchar的,每行数据的大小就是sizeof(uchar)*width=width字节,这个大小由width决定,如果width是4的倍数,那么widthstep就是width,如果不是4的倍数,需要补齐4个字节。比如width=16,widthstep=16;width=18,widthstep=(width+3)/4*4=20字节。对于3通道float类型的图像,其widthstep=(width*3*sizeof(float)*3+3)/4*4;因此这个widthstep只和宽度和数据类型有关。不管是IplImage和Mat两者读同样的图像,其widthstep都是一样的,但是两者存储的图像数据类型都是uchar,不管你创建的图像是什么类型的,一般读取的图像数据类型都是char,然而在处理的过程中,可能会创建一幅大小相同,数据类型不同(如float、double)的图像(准确讲这不是图像了,算做数组),比如积分图像,每个像素的值不可能仅限于0-255或者-127-128,用char类型的图像来存储显然是不够的。下面来解释如何访问float或者double类型的图像数据。

比如,现在我们创建一幅宽*高为111*113大小的3通道double类型的图像image=cvCreateImage(cvSize(111,113),IPL_DEPTH_64F,3);

这里的widthstep=(111*3*sizeof(double)+3)/4*4=2664;因为111*3*sizeof(double)=2664已经正好是4的倍数了,因此无需补充字节。现在用指针访问第31行、55列的图像数据,这个数据应该是double类型的。image->imageData的类型是char的,因此可以转换成double,通过double指针来访问:

[cpp]  view plain  copy
  1. double *data=(double*)image->imageData;  
  2. double val=*(data+31*width+51);  

或者可以通过uchar指针找到(31,51)处的地址,然后转换成double指针进行访问:

[cpp]  view plain  copy
  1. char* data=image->imageData;  
  2. double val=*(double*)(data+31*image->widthStep+51*sizeof(double));  
对于IplImage,指针访问可以参考以上两种方式,其实这本质就是数据类型的转换而已,计算机专业的同学很容易理解,这里主要面对类似咱这种非计算机专业而言的。

对于Mat,指针访问就更简单了,有一种方法很方便:double ptr=(double*)m.ptr(y);这里就能访问第y行的数据了,然后用ptr[x]就可以访问第y行、x列的数据了。

图像边缘检测的基本原理

①.基本原理

在图像处理和计算机视觉中,边缘检测被广泛使用。其目的在于标识出数字图像中亮点变化明显的点,进而

提取出有用的信息。通常情况下我们可以将数字图像表示为二位数组,而概二位数组中每个元素的值则对应

着图像各个像素点的灰度值。而边缘检测的根本原理是通过算法将该数组中各个数据邻域内数值变化大的数据

元素进行突出显示,而邻域内变化不大的相邻数据元素数据元素进行屏蔽或降低其灰度显示。

不能看出其边缘检测的很像即为如何找出一种算法来突出这种邻域内的数值变化率。

②.边缘检测算法有哪些

不难看出,边缘检测算法的核心是突出图像中变化率,无论目标与目标,还是目标与背景之间。这于导数的

概念离奇的相近。而对于离散的数字图像中,我们可以使用与求导类比的差分运算来提取图像边缘。基于此原

理应用于二维数组中我们可以求出该二维数组的梯度模矩阵。该梯度模矩阵就能比较清楚的表示出图像矩阵的

边缘。当然也可以设定一个阈值,当梯度模矩阵中大于阈值的元素则保留,而低于阈值的元素则设为黑度。

根据梯度模矩阵的不同求法,边缘检测算法可以分为两大类:一阶导数方式(梯度算子)和二阶导数方式

而一阶导数方式中几种常见的边缘算子为:Robert,Sobel,PreWitt,kvisch.

而二阶导数方式常见的有:laplace算子



③.边缘检测在图像处理中的一般步骤

 



 其中第一步为滤波,因为图像中存在噪声所以需要先进行滤波。然而数字图像中的噪声大多和边缘信号一

样占据高频段,所以如果滤波过于完全很可能连同边缘一起滤除,使得滤波后的图像变得模糊,无法提取有

效的边缘。而第二步为我们通常所说的利用边缘算子对边缘进行增强。这一步的结果便可直接当做边缘检测

的结果。然而大多数边缘检测还需要进行第三部,设定阈值,对超过阈值的像素点进行突出,对低于阈值的像

素点进行屏蔽。





1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值