OPENCV用户手册之图像处理部分(之二):采样、差值与几何变换(中文翻译)
2008-04-11 19:06
429 查看
2004年09月03日 09:26:00
image
带线段的图像.
pt1
线段起始点
pt2
线段结束点
line_iterator
指向线段迭代器结构的指针
connectivity
被扫描线段的连通数,4 或
8.
函数
cvInitLineIterator
初始化线段迭代器,并返回两点之间的象素点数目。两个点必须在图像内。当迭代器初始化后,连接两点的光栅线上所有点,都可以连续通过调用
Bresenham 算法逐点计算的。
image
带线段图像
pt1
起点
pt2
终点
buffer
存储线段点的缓存区,必须有足够大小来存储点 max( |
|
) :8-连通情况下,以及 |
: 4-连通情况下.
connectivity
The line connectivity, 4 or 8.
函数 cvSampleLine 实现了线段迭代器的一个特殊应用。它读取由两点
pt1 和 pt2 确定的线段上的所有图像点,包括终点,并存储到缓存中。
src
输入图像.
dst
提取的矩形.
center
提取的象素矩形的中心,浮点数坐标。中心必须位于图像内部.
函数
cvGetRectSubPix 从图像
其中非整数象素点坐标采用双线性差值提取。对多通道图像,每个通道独立单独完成提取。矩形中心必须位于图像内部,而整个矩形可以部分不在图像内。这种情况下,复制的边界模识用来得到图像边界外的象素值(Hunnish:令人费解)
src
输入图像.
dst
提取的四边形.
map_matrix
3 × 2 变换矩阵
[
(见讨论).
fill_outliers
该标志位指定是否对原始图像边界外面的象素点使用复制模式(
fill_value
对原始图像边界外面的象素设定固定值,当
函数
cvGetQuadrangleSubPix 从图像
,计算公式是:
[/code]
其中在非整数坐标 A"(x,y)T+b
的象素点值通过双线性变换得到。多通道图像的每一个通道都单独计算.
src
输入图像.
dst
输出图像.
interpolation
差值方法:
CV_INTER_NN - 最近邻差值,
CV_INTER_LINEAR - 双线性差值 (缺省使用)
CV_INTER_AREA - 使用象素关系重采样。当图像缩小时候,该方法可以避免波纹出现。当图像放大是,类似于
方法..
CV_INTER_CUBIC - 立方差值.
函数
cvResize 将图像
src
输入图像.
dst
输出图像.
map_matrix
2×3 变换矩阵
flags
差值方法与开关选项:
CV_WARP_FILL_OUTLIERS - 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为
CV_WARP_INVERSE_MAP - 指定
函数从
fillval
用来填充边界外面的值
函数
cvWarpAffine 利用下面指定的矩阵变换输入图像:
函数与
cvGetQuadrangleSubPix 类似,但是不完全相同。
cvWarpAffine
要求输入和输出图像具有同样的数据类型,有更大的资源开销(因此对大图像不太合适)而且输出图像的部分可以保留不变。而
cvGetQuadrangleSubPix
可以精确地从8位图像中提取四边形到浮点数缓存区中,具有比较小的系统开销,而且总是全部改变输出图像的内容。
要变换稀疏矩阵,使用 cxcore
中的函数
cvTransform 。
center
输入图像的旋转中心
angle
旋转角度(度)。正值表示逆时针旋转(坐标原点假设在左上角).
scale
各项同性的尺度因子
map_matrix
输出 2×3
矩阵的指针
函数
cv2DRotationMatrix 计算矩阵:
该变换映射旋转中心到它本身。如果这不是目的的话,应该调整平移(Hunnish: 这段话令人费解:The transformation maps
the rotation center to itself. If this is not the purpose, the
shift should be adjusted)
src
输入图像.
dst
输出图像.
map_matrix
3×3 变换矩阵
flags
差值方法的开关选项:
CV_WARP_FILL_OUTLIERS - 填充所有缩小图像的象素。如果部分象素落在输入图像的边界外,那么它们的值设定为
CV_WARP_INVERSE_MAP - 指定
函数从
fillval
用来填充边界外面的值
函数
cvWarpPerspective 利用下面指定矩阵变换输入图像:
要变换稀疏矩阵,使用 cxcore
中的函数
cvTransform 。
src
输入图像的四边形的4个点坐标
dst
输出图像的对应四边形的4个点坐标
map_matrix
输出的 3×3
矩阵
函数
cvWarpPerspectiveQMatrix 计算透视变换矩阵,使得:
where
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=93174
分享到新浪微博
采样、差值和几何变换
翻译: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); { int offset, x, y; offset = iterator.ptr - (uchar*)(image->imageData); y = offset/image->widthStep; x = (offset - y*image->widthStep)/(3*sizeof(uchar) ); 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 [code]Aand
bare taken from
map_matrix| A11 A12 b1 |map_matrix = | | | A21 A22 b2 |
[/code]
其中在非整数坐标 A"(x,y)T+b
的象素点值通过双线性变换得到。多通道图像的每一个通道都单独计算.
例子:使用 cvGetQuadrangleSubPix
进行图像旋转
#include "cv.h"#include "highgui.h"#include "math.h"int main( int argc, char** argv ){ IplImage* src; 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',y')<-src(x,y)如果没有指定 CV_WARP_INVERSE_MAP , (x',y')T=map_matrix"(x,y,1)T+b ,否则, (x, y)T=map_matrix"(x',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',y')<-src(x,y)若指定 CV_WARP_INVERSE_MAP, (tx',ty',t)T=map_matrix"(x,y,1)T+b否则, (tx, ty, t)T=map_matrix"(x',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.
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=93174
分享到新浪微博
相关文章推荐
- OPENCV用户手册之图像处理部分(之一):梯度、边缘与角点(中文翻译)
- OPENCV用户手册之图像处理部分(之三):形态学操作(中文翻译)
- OPENCV用户手册之图像处理部分(之三):形态学操作(中文翻译)
- OPENCV用户手册之图像处理部分(之四):滤波器与色彩转换(中文翻译)
- 【opencv+python】图像处理之二、几何变换(仿射与投影)的应用
- OPENCV之CV部分参考手册的中文翻译
- OPENCV之CV部分参考手册的中文翻译
- 【opencv+python】图像处理之二、几何变换(仿射与投影)的应用
- 【opencv+python】图像处理之二、几何变换(仿射与投影)的原理
- OPENCV用户手册之图像处理(网络资料搜集整理)
- 【第二部分-图像处理】第3章 Opencv图像处理进阶-【1 图像处理A-滤波】(imgproc组件、feature2D组件)
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【3 直方图与匹配 E】
- 【opencv 官方教程】翻译3 图像处理 上
- 【OpenCV图像处理】四、图像的几何变换(上)
- gentoo开发手册部分中文翻译
- 【第二部分 图像处理】第4章 Opencv图像处理高阶【1马赛克】
- 【第二部分 图像处理】第3章 Opencv图像处理进阶-【1 图像处理E-阈值化】(imgproc组件、feature2D组件)
- 【第二部分 图像处理】第3章 Opencv图像处理进阶【4 图像轮廓A】
- OpenCV2计算机编程手册(二)基于类的图像处理
- 《cv中文参考手册-图像轮廓处理-结构分析与形状识别--外接正矩形轮廓区域》