分享
 
 
 

OPENCV用户手册之图像处理部分:采样、差值与几何变换(中文翻译)

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

采样、差值和几何变换

翻译:HUNNISH, 阿须数码

InitLineIterator

初始化线段迭代器

int cvInitLineIterator( const CvArr* image, CvPoint pt1, CvPoint pt2,

CvLineIterator* line_iterator, int connectivity=8 );

image

带线段的图像.

pt1

线段起始点

pt2

线段结束点

line_iterator

指向线段迭代器结构的指针

connectivity

被扫描线段的连通数,4 或 8.

函数 cvInitLineIterator 初始化线段迭代器,并返回两点之间的象素点数目。两个点必须在图像内。当迭代器初始化后,连接两点的光栅线上所有点,都可以连续通过调用 CV_NEXT_LINE_POINT 来得到。线段上的点是使用 4-连通或8-连通利用 Bresenham 算法逐点计算的。

例子:使用线段迭代器计算彩色线上象素值的和 CvScalar sum_line_pixels( IplImage* image, CvPoint pt1, CvPoint pt2 )

{

CvLineIterator iterator;

int blue_sum = 0, green_sum = 0, red_sum = 0;

int count = cvInitLineIterator( image, pt1, pt2, &iterator, 8 );

for( int i = 0; i < count; i++ ){

blue_sum += iterator.ptr[0];

green_sum += iterator.ptr[1];

red_sum += iterator.ptr[2];

CV_NEXT_LINE_POINT(iterator);

/* print the pixel coordinates: demonstrates how to calculate the coordinates */

{

int offset, x, y;

/* assume that ROI is not set, otherwise need to take it into account. */

offset = iterator.ptr - (uchar*)(image->imageData);

y = offset/image->widthStep;

x = (offset - y*image->widthStep)/(3*sizeof(uchar) /* size of pixel */);

printf("(%d,%d)\n", x, y );

}

}

return cvScalar( blue_sum, green_sum, red_sum );

}

SampleLine

将光栅线读入缓冲区

int cvSampleLine( const CvArr* image, CvPoint pt1, CvPoint pt2,

void* buffer, int connectivity=8 );

image

带线段图像

pt1

起点

pt2

终点

buffer

存储线段点的缓存区,必须有足够大小来存储点 max( |pt2.x-pt1.x|+1, |pt2.y-pt1.y|+1 ) :8-连通情况下,以及 |pt2.x-pt1.x|+|pt2.y-pt1.y|+1 : 4-连通情况下.

connectivity

The line connectivity, 4 or 8.

函数 cvSampleLine 实现了线段迭代器的一个特殊应用。它读取由两点 pt1 和 pt2 确定的线段上的所有图像点,包括终点,并存储到缓存中。

GetRectSubPix

从图像中提取象素矩形,使用子象素精度

void cvGetRectSubPix( const CvArr* src, CvArr* dst, CvPoint2D32f center );

src

输入图像.

dst

提取的矩形.

center

提取的象素矩形的中心,浮点数坐标。中心必须位于图像内部.

函数 cvGetRectSubPix 从图像 src 中提取矩形:

dst(x, y) = src(x + center.x - (width(dst)-1)*0.5, y + center.y - (height(dst)-1)*0.5)

其中非整数象素点坐标采用双线性差值提取。对多通道图像,每个通道独立单独完成提取。矩形中心必须位于图像内部,而整个矩形可以部分不在图像内。这种情况下,复制的边界模识用来得到图像边界外的象素值(Hunnish:令人费解)

GetQuadrangleSubPix

提取象素四边形,使用子象素精度

void cvGetQuadrangleSubPix( const CvArr* src, CvArr* dst, const CvMat* map_matrix,

int fill_outliers=0, CvScalar fill_value=cvScalarAll(0) );

src

输入图像.

dst

提取的四边形.

map_matrix

3 × 2 变换矩阵 [A|b] (见讨论).

fill_outliers

该标志位指定是否对原始图像边界外面的象素点使用复制模式(fill_outliers=0)进行差值或者将其设置为指定值(fill_outliers=1)。

fill_value

对原始图像边界外面的象素设定固定值,当 fill_outliers=1.

函数 cvGetQuadrangleSubPix 从图像 src 中提取四边形,使用子象素精度,并且将结果存储于 dst ,计算公式是:

dst(x+width(dst)/2, y+height(dst)/2)= src( A11x+A12y+b1, A21x+A22y+b2),

where A and b are taken from map_matrix

| A11 A12 b1 |

map_matrix = | |

| A21 A22 b2 |

其中在非整数坐标 A•(x,y)T+b 的象素点值通过双线性变换得到。多通道图像的每一个通道都单独计算.

例子:使用 cvGetQuadrangleSubPix 进行图像旋转#include "cv.h"

#include "highgui.h"

#include "math.h"

int main( int argc, char** argv )

{

IplImage* src;

/* the first command line parameter must be image file name */

if( argc==2 && (src = cvLoadImage(argv[1], -1))!=0)

{

IplImage* dst = cvCloneImage( src );

int delta = 1;

int angle = 0;

cvNamedWindow( "src", 1 );

cvShowImage( "src", src );

for(;;)

{

float m[6];

double factor = (cos(angle*CV_PI/180.) + 1.1)*3;

CvMat M = cvMat( 2, 3, CV_32F, m );

int w = src->width;

int h = src->height;

m[0] = (float)(factor*cos(-angle*2*CV_PI/180.));

m[1] = (float)(factor*sin(-angle*2*CV_PI/180.));

m[2] = w*0.5f;

m[3] = -m[1];

m[4] = m[0];

m[5] = h*0.5f;

cvGetQuadrangleSubPix( src, dst, &M, 1, cvScalarAll(0));

cvNamedWindow( "dst", 1 );

cvShowImage( "dst", dst );

if( cvWaitKey(5) == 27 )

break;

angle = (angle + delta) % 360;

}

}

return 0;

}

Resize

图像大小变换

void cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR );

src

输入图像.

dst

输出图像.

interpolation

差值方法:

CV_INTER_NN - 最近邻差值,

CV_INTER_LINEAR - 双线性差值 (缺省使用)

CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大是,类似于 CV_INTER_NN 方法..

CV_INTER_CUBIC - 立方差值.

函数 cvResize 将图像 src 改变尺寸得到与 dst 同样大小。若设定 ROI,函数将按常规支持 ROI.

WarpAffine

对图像做仿射变换

void cvWarpAffine( const CvArr* src, CvArr* dst, const CvMat* map_matrix,

int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,

CvScalar fillval=cvScalarAll(0) );

src

输入图像.

dst

输出图像.

map_matrix

2×3 变换矩阵

flags

差值方法与开关选项:

CV_WARP_FILL_OUTLIERS - 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.

CV_WARP_INVERSE_MAP - 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素差值。否则, 函数从 map_matrix 得到反变换。

fillval

用来填充边界外面的值

函数 cvWarpAffine 利用下面指定的矩阵变换输入图像:

dst(x&apos;,y&apos;)<-src(x,y)

如果没有指定 CV_WARP_INVERSE_MAP , (x&apos;,y&apos;)T=map_matrix•(x,y,1)T+b ,

否则, (x, y)T=map_matrix•(x&apos;,y&apos,1)T+b

函数与 cvGetQuadrangleSubPix 类似,但是不完全相同。 cvWarpAffine 要求输入和输出图像具有同样的数据类型,有更大的资源开销(因此对大图像不太合适)而且输出图像的部分可以保留不变。而 cvGetQuadrangleSubPix 可以精确地从8位图像中提取四边形到浮点数缓存区中,具有比较小的系统开销,而且总是全部改变输出图像的内容。

要变换稀疏矩阵,使用 cxcore 中的函数 cvTransform

2DRotationMatrix

计算二维旋转的仿射变换矩阵

CvMat* cv2DRotationMatrix( CvPoint2D32f center, double angle,

double scale, CvMat* map_matrix );

center

输入图像的旋转中心

angle

旋转角度(度)。正值表示逆时针旋转(坐标原点假设在左上角).

scale

各项同性的尺度因子

map_matrix

输出 2×3 矩阵的指针

函数 cv2DRotationMatrix 计算矩阵:

[ α β | (1-α)*center.x - β*center.y ]

[ -β α | β*center.x + (1-α)*center.y ]

where α=scale*cos(angle), β=scale*sin(angle)

该变换映射旋转中心到它本身。如果这不是目的的话,应该调整平移(Hunnish: 这段话令人费解:The transformation maps the rotation center to itself. If this is not the purpose, the shift should be adjusted)

WarpPerspective

对图像进行透视变换

void cvWarpPerspective( const CvArr* src, CvArr* dst, const CvMat* map_matrix,

int flags=CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS,

CvScalar fillval=cvScalarAll(0) );

src

输入图像.

dst

输出图像.

map_matrix

3×3 变换矩阵

flags

差值方法的开关选项:

CV_WARP_FILL_OUTLIERS - 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为 fillval.

CV_WARP_INVERSE_MAP - 指定 matrix 是输出图像到输入图像的反变换,因此可以直接用来做象素差值。否则, 函数从 map_matrix 得到反变换。

fillval

用来填充边界外面的值

函数 cvWarpPerspective 利用下面指定矩阵变换输入图像:

dst(x&apos;,y&apos;)<-src(x,y)

若指定 CV_WARP_INVERSE_MAP, (tx&apos;,ty&apos;,t)T=map_matrix•(x,y,1)T+b

否则, (tx, ty, t)T=map_matrix•(x&apos;,y&apos,1)T+b

要变换稀疏矩阵,使用 cxcore 中的函数 cvTransform

WarpPerspectiveQMatrix

用4个对应点计算透视变换矩阵

CvMat* cvWarpPerspectiveQMatrix( const CvPoint2D32f* src,

const CvPoint2D32f* dst,

CvMat* map_matrix );

src

输入图像的四边形的4个点坐标

dst

输出图像的对应四边形的4个点坐标

map_matrix

输出的 3×3 矩阵

函数 cvWarpPerspectiveQMatrix 计算透视变换矩阵,使得:

(tix'i,tiy'i,ti)T=matrix•(xi,yi,1)T

where dst(i)=(x'i,y'i), src(i)=(xi,yi), i=0..3.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有