采样、差值和几何变换
翻译:HUNNISH, 阿须数码
初始化线段迭代器
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 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 );
}
将光栅线读入缓冲区
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 确定的线段上的所有图像点,包括终点,并存储到缓存中。
从图像中提取象素矩形,使用子象素精度
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:令人费解)
提取象素四边形,使用子象素精度
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;
}
图像大小变换
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.
对图像做仿射变换
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') 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 。
计算二维旋转的仿射变换矩阵
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)
对图像进行透视变换
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') 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 。
用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
.
分享到:
相关推荐
OpenCV中文手册.pdf是一本关于计算机视觉和图像处理的技术手册,涵盖了图像处理、特征检测、图像变换、形态学操作、滤波器、色彩空间变换、金字塔、连接部件、图像与轮廓矩、特殊图像变换、直方图、匹配等主题。...
在本实验中,我们主要探讨的是数字图像处理领域中的一个重要主题——几何变换与变形。这个实验是山东大学针对数字图像处理课程所设计的,旨在帮助学生深入理解和掌握图像处理的基本技术,尤其是通过C++编程语言和...
内容概要:本文通过详细的步骤解析介绍了如何使用 Python 和 OpenCV 实现基本图像处理任务,涵盖图像颜色通道的分离和合并,常见的几种几何变换(缩放、旋转和平移)以及常用的滤波技术用于降噪的目的,并提供代码...
在本文中,我们将深入探讨如何使用OpenCV库与MFC(Microsoft Foundation Classes)框架来创建一个图像处理程序。OpenCV是一个强大的开源计算机视觉库,它提供了丰富的图像处理和计算机视觉功能,而MFC是微软提供的...
在图像处理领域,几何变换是一种常见的操作,用于改变图像的空间结构。这个压缩包中的资源显然与这一主题密切相关,包括实际的图像文件、处理代码以及几种不同的特征检测算法。以下是关于这些知识点的详细说明: 1....
以上所述知识点是基于OpenCV进行数字图像处理的核心部分,通过理解和熟练应用这些技术,我们可以构建出复杂的图像处理系统,解决实际问题。在实际开发中,配合VC++或其他编程环境,开发者可以利用OpenCV的强大功能,...
OpenCV(开源计算机视觉库)是一个强大的工具,用于在各种编程环境中进行数字图像处理和计算机视觉任务。在本教程中,我们将重点介绍如何在古老的Visual C++ 6.0(简称VC6.0)环境下利用OpenCV进行图像处理。虽然VC...
在本项目中,我们主要探讨的是使用OpenCV库与C++进行图像处理,特别是针对遥感图像的配准系统。OpenCV(Open Source Computer Vision Library)是一个强大的计算机视觉和机器学习软件库,它包含了众多用于图像处理、...
图像处理包括:灰度化、均值滤波、边缘检测、伽马变换、旋转镜像、亮度调节、二值化、对比度,饱和度调节、色彩调节、图片保存、水印等。 视频处理包括:二值化、边缘检测、灰度化、平滑、局部马赛克、缩放等。 此外...
使用MFC实现opencv中图像处理的部分函数功能: 实现的主要内容有主要包含有: 图像灰度化: 最大值灰度化: 单通道灰度化: 平均值灰度化: 加权平均灰度化: 图像缩放: 最近邻内插法: 双线性内插法: ...
在图像处理领域,几何变换是不可或缺的一部分,它主要用于改变图像的位置、大小、形状或方向,以适应不同的应用场景或实现特定的视觉效果。本项目聚焦于使用Microsoft Foundation Classes (MFC)库在Visual Studio ...
这个压缩包“OPENCV函数手册(中文).zip”显然是为中文用户提供的OpenCV函数参考手册,帮助开发者更好地理解和使用OpenCV中的各种函数。 OpenCV库的核心功能主要分为以下几个方面: 1. 图像处理:包括读取、写入...
本主题将深入探讨如何使用OpenCV进行图像的几何变换,主要包括图像的旋转、缩放、内凹变形和外凸变形。我们将使用C++语言,并在Visual Studio 2013环境下进行开发,使用的OpenCV版本为3。 首先,图像旋转是改变图像...
OpenCV中的小波变换和逆变换功能为图像处理提供了一种强大而灵活的手段。通过合理地利用这些功能,可以在多个应用场景中提高图像处理的质量和效率。未来随着技术的发展,小波变换的应用将会更加广泛。 #### 六、...
OpenCV主要用于实时图像处理、计算机视觉以及机器学习任务,广泛应用于图像识别、人脸识别、物体检测、图像分割、视频分析等领域。 二、OpenCV函数分类 OpenCV函数大致可以分为以下几类: 1. 图像基本操作:包括...
本讲义主要讲述OpenCV图像处理的基础知识,包括图像处理简介、OpenCV简介、图像处理操作、图像特征提取与描述、视频操作等。 1. 图像处理简介 图像处理是从图像采集、图像处理到图像再现的整个过程。图像处理的...
在数字图像处理领域,几何变换是一种重要的技术,用于改变图像的空间位置、大小或形状,而不会影响图像的视觉内容。本程序集成了图像的旋转、缩放和平移等基本操作,采用C++编程语言实现,这使得它具有高效性和广泛...
OpenCV 1.0虽然版本较旧,但依旧包含了基本的图像处理功能,如图像读取、显示、变换以及各种滤波器等。在这个项目中,OpenCV被用来实现图像的读取、显示以及核心的图像处理功能,如人脸检测和边缘检测。 然后,VC...
《OpenCV中文版用户手册》是一本非常实用的资源,为开发者提供了全面的OpenCV库函数解释和使用指南。OpenCV(开源计算机视觉库)是一个强大的工具,广泛应用于图像处理、计算机视觉以及机器学习等领域。这本手册是...
第二部分进阶篇主要介绍图像处理技术,包括灰度变换技术、平滑技术、边缘检测及形态学技术;第三部分高级篇主要介绍图像应用技术,包括图像分割技术、特征分析和复杂视频处理技术。进阶篇与高级篇的每章末节均提供了...