2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
1
void ShowImage5(HDC hDc,DWORD ImgWidth,DWORD ImgHeight,HDC hdcmem)
{
//图像平移
DWORD i,j,l,k;
COLORREF color;
int offsetx,offsety;
offsetx=30;
offsety=50;
for(j=0;j<ImgHeight;j++)
{
k=j+offsety;
for(i=0;i<ImgWidth;i++)
{
l=i+offsetx;
color=GetPixel(hdcmem,i,j);
SetPixelV(hDc,l,k,color);
}
}
}
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
2
void ShowImage6(HDC hDc,DWORD ImgWidth,DWORD ImgHeight,HDC hdcmem)
{
//图像比例缩放 。 设比例缩放倍数为 K,实行由原图像到目的图像的正变换,
//目的图像中的一些点可能成为空点
DWORD i,j,l,k;
COLORREF color;
double scale_factor_row,scale_factor_col;
scale_factor_row=1.2;
scale_factor_col=1.2;
for(j=0;j<ImgHeight;j++)
for(i=0;i<ImgWidth;i++)
{
l=i*scale_factor_row+0.5;
k=j*scale_factor_col+0.5;
color=GetPixel(hdcmem,i,j);
SetPixelV(hDc,l,k,color);
}
}
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
3
void ShowImage7(HDC hDc,DWORD ImgWidth,DWORD ImgHeight,HDC hdcmem)
{
//最邻近点图像比例缩放 。 设比例缩放倍数为 K,方法是把目的图像中的
//点用源图像中的最邻近点表示 。
DWORD i,j,l,k;
COLORREF color;
double scale_factor_row,scale_factor_col,delta_x,delta_y;
int im,in;
scale_factor_row=1.2;
scale_factor_col=1.2;
im=ImgWidth*scale_factor_row+0.5;
in=ImgHeight*scale_factor_col+0.5;
delta_x=(ImgWidth-1)/(double)(im-1);
delta_y=(ImgHeight-1)/(double)(in-1);
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
4
for(j=0;j<in;j++)
for(i=0;i<im;i++)
{
//计算缩放后的坐标点,并得到对应源图像的最邻近点
l=i*delta_x+0.5;
k=j*delta_y+0.5;
color=GetPixel(hdcmem,l,k);
SetPixelV(hDc,i,j,color);
}
}
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
5
void ShowImage8(HDC hDc,DWORD ImgWidth,DWORD ImgHeight,HDC hdcmem)
{
//二次线性插值图像比例缩放 。 设比例缩放倍数为 K,方法是把目的图像
//中的点用源图像中邻近点的二次线性插值表示 。
DWORD i,j;
COLORREF color;
double RColor,GColor,BColor;
double scale_factor_row,scale_factor_col,delta_x,delta_y;
double xx,yy,cx,cy,cx1,cy1;
int im,in,l,k;
scale_factor_row=2;
scale_factor_col=2;
im=ImgWidth*scale_factor_row+0.5;
in=ImgHeight*scale_factor_col+0.5;
delta_x=(ImgWidth-1)/(double)(im-1);
delta_y=(ImgHeight-1)/(double)(in-1);
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
6
for(j=0;j<in;j++)
for(i=0;i<im;i++)
{
//计算缩放后的坐标点,并计算二次线性插值
xx=i*delta_x;
yy=j*delta_y;
l=(int)xx;
k=(int)yy;
cx=xx-l;
cy=yy-k;
cx1=1-cx;
cy1=1-cy;
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
7
RColor=(GetRValue(GetPixel(hdcmem,l,k))*cx1*cy1
+GetRValue(GetPixel(hdcmem,l+1,k))*cx*cy1
+GetRValue(GetPixel(hdcmem,l,k+1))*cx1*cy
+GetRValue(GetPixel(hdcmem,l+1,k+1))*cx*cy)+0.5;
GColor=(GetGValue(GetPixel(hdcmem,l,k))*cx1*cy1
+GetGValue(GetPixel(hdcmem,l+1,k))*cx*cy1
+GetGValue(GetPixel(hdcmem,l,k+1))*cx1*cy
+GetGValue(GetPixel(hdcmem,l+1,k+1))*cx*cy)+0.5;
BColor=(GetBValue(GetPixel(hdcmem,l,k))*cx1*cy1
+GetBValue(GetPixel(hdcmem,l+1,k))*cx*cy1
+GetBValue(GetPixel(hdcmem,l,k+1))*cx1*cy
+GetBValue(GetPixel(hdcmem,l+1,k+1))*cx*cy)+0.5;
color=RGB(RColor,GColor,BColor);
SetPixelV(hDc,i,j,color);
}
}
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
8
void ShowImage9(HDC hDc,DWORD ImgWidth,DWORD ImgHeight,HDC hdcmem)
{
//最邻近点图像旋转 。 方法是把目的图像中的点用源图像中的最邻近点表示 。
DWORD i,j,l,k;
COLORREF color;
int center_x,center_y;
float SrcX1,SrcY1,SrcX2,SrcY2,SrcX3,SrcY3,SrcX4,SrcY4;
float DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4;
DWORD Wnew,Hnew;
float theta;
float cosa,sina;
float num1,num2;
theta=10;
//三角函数使用弧度,将角度转换为弧度
theta=(float)(theta*2*3.14159/360);
cosa=(float)cos((double)theta);
sina=(float)sin((double)theta);
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
9
//以图像中心为旋转中心点进行变换
center_x=ImgWidth/2;
center_y=ImgHeight/2;
//计算目的图像的水平和垂直范围
//将坐标原点平移到图像中心,图像左上角坐标
SrcX1=-center_x;
SrcY1=-center_y;
//图像右上角坐标
SrcX2=center_x;
SrcY2=-center_y;
//图像左下角坐标
SrcX3=-center_x;
SrcY3=center_y;
//图像右下角坐标
SrcX4=center_x;
SrcY4=center_y;
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
10
//旋转变换后
//图像左上角坐标
DstX1=cosa*SrcX1+sina*SrcY1;
DstY1=-sina*SrcX1+cosa*SrcY1;
//图像右上角坐标
DstX2=cosa*SrcX2+sina*SrcY2;
DstY2=-sina*SrcX2+cosa*SrcY2;
//图像左下角坐标
DstX3=cosa*SrcX3+sina*SrcY3;
DstY3=-sina*SrcX3+cosa*SrcY3;
//图像右下角坐标
DstX4=cosa*SrcX4+sina*SrcY4;
DstY4=-sina*SrcX4+cosa*SrcY4;
//旋转变换后图像的宽度和高度
Wnew = (DWORD)(max(fabs(DstX4-DstX1),fabs(DstX3-DstX2))+0.5);
Hnew = (DWORD)(max(fabs(DstY4-DstY1),fabs(DstY3-DstY2))+0.5);
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
11
//对图像进行反向变换后的,X坐标和 Y坐标的常数项
num1=(float)(-0.5*Wnew*cosa-0.5*Hnew*sina+center_x);
num2=(float)(0.5*Wnew*sina-0.5*Hnew*cosa+center_y);
for(j=0;j<Hnew;j++)
for(i=0;i<Wnew;i++)
{
l= (DWORD)(i*cosa+j*sina+num1);
k= (DWORD)(-1.0f*i*sina+j*cosa+num2);
if( (l>=0) && (l<ImgWidth) && (k>=0) && (k<ImgHeight))
{
color=GetPixel(hdcmem,l,k);
SetPixelV(hDc,i,j,color);
}
}
}
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
12
void ShowImage10(HDC hDc,DWORD ImgWidth,DWORD ImgHeight,HDC hdcmem)
{
//二次线性插值图像旋转 。 方法是把目的图像中的点用源图像中
//邻近点的二次线性插值表示 。
DWORD i,j,l,k;
COLORREF color;
double RColor,GColor,BColor;
int center_x,center_y;
float SrcX1,SrcY1,SrcX2,SrcY2,SrcX3,SrcY3,SrcX4,SrcY4;
float DstX1,DstY1,DstX2,DstY2,DstX3,DstY3,DstX4,DstY4;
DWORD Wnew,Hnew;
float theta;
float cosa,sina;
float num1,num2,xx,yy,cx,cy,cx1,cy1;
theta=10;
//三角函数使用弧度,将角度转换为弧度
theta=(float)(theta*2*3.14159/360);
cosa=(float)cos((double)theta);
sina=(float)sin((double)theta);
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
13
//以图像中心为旋转中心点进行变换
center_x=ImgWidth/2;
center_y=ImgHeight/2;
//计算目的图像的水平和垂直范围
//将坐标原点平移到图像中心,图像左上角坐标
SrcX1=-center_x;
SrcY1=-center_y;
//图像右上角坐标
SrcX2=center_x;
SrcY2=-center_y;
//图像左下角坐标
SrcX3=-center_x;
SrcY3=center_y;
//图像右下角坐标
SrcX4=center_x;
SrcY4=center_y;
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
14
//旋转变换后
//图像左上角坐标
DstX1=cosa*SrcX1+sina*SrcY1;
DstY1=-sina*SrcX1+cosa*SrcY1;
//图像右上角坐标
DstX2=cosa*SrcX2+sina*SrcY2;
DstY2=-sina*SrcX2+cosa*SrcY2;
//图像左下角坐标
DstX3=cosa*SrcX3+sina*SrcY3;
DstY3=-sina*SrcX3+cosa*SrcY3;
//图像右下角坐标
DstX4=cosa*SrcX4+sina*SrcY4;
DstY4=-sina*SrcX4+cosa*SrcY4;
//旋转变换后图像的宽度和高度
Wnew = (DWORD)(max(fabs(DstX4-DstX1),fabs(DstX3-DstX2))+0.5);
Hnew = (DWORD)(max(fabs(DstY4-DstY1),fabs(DstY3-DstY2))+0.5);
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
15
//对图像进行反向变换后的,X坐标和 Y坐标的常数项
num1=(float)(-0.5*Wnew*cosa-0.5*Hnew*sina+center_x);
num2=(float)(0.5*Wnew*sina-0.5*Hnew*cosa+center_y);
for(j=0;j<Hnew;j++)
for(i=0;i<Wnew;i++)
{
xx=i*cosa+j*sina+num1;
yy=-1.0f*i*sina+j*cosa+num2;
if( (xx>=0) && (xx<ImgWidth) && (yy>=0) && (yy<ImgHeight))
{
l=(int)xx;
k=(int)yy;
cx=xx-l;
cy=yy-k;
cx1=1-cx;
cy1=1-cy;
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
16
RColor=(GetRValue(GetPixel(hdcmem,l,k))*cx1*cy1
+GetRValue(GetPixel(hdcmem,l+1,k))*cx*cy1
+GetRValue(GetPixel(hdcmem,l,k+1))*cx1*cy
+GetRValue(GetPixel(hdcmem,l+1,k+1))*cx*cy)+0.5;
GColor=(GetGValue(GetPixel(hdcmem,l,k))*cx1*cy1
+GetGValue(GetPixel(hdcmem,l+1,k))*cx*cy1
+GetGValue(GetPixel(hdcmem,l,k+1))*cx1*cy
+GetGValue(GetPixel(hdcmem,l+1,k+1))*cx*cy)+0.5;
BColor=(GetBValue(GetPixel(hdcmem,l,k))*cx1*cy1
+GetBValue(GetPixel(hdcmem,l+1,k))*cx*cy1
+GetBValue(GetPixel(hdcmem,l,k+1))*cx1*cy
+GetBValue(GetPixel(hdcmem,l+1,k+1))*cx*cy)+0.5;
color=RGB(RColor,GColor,BColor);
SetPixelV(hDc,i,j,color);
}
}
}
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
17
void ShowImage11(HDC hDc,DWORD ImgWidth,DWORD ImgHeight,HDC hdcmem)
{
//错切变换,实行由原图像到目的图像的变换,
//变换中心点为原图像中心点
DWORD i,j;
COLORREF color;
int centerx,centery,xx,yy,x,y;
double sx,sy;
sx=0.3;
sy=0.3;
centerx=ImgWidth/2;
centery=ImgHeight/2;
2009年 7月 24日 数字图象处理演示稿 纪玉波制作
(C)
18
for(j=0;j<ImgHeight;j++)
{
yy=j-centery;
for(i=0;i<ImgWidth;i++)
{
xx=i-centerx;
x=xx+sx*yy+centerx+0.5;
y=sy*xx+yy+centery+0.5;
color=GetPixel(hdcmem,i,j);
SetPixelV(hDc,x,y,color);
}
}
}