【数字图像处理之四】图像的放大缩小旋转

缩放放大:

修改红框里面的参数,2.0表示放大两倍,0.5表示缩小两倍。

旋转:

修改红框里面的参数,表示旋转多少度。逆时针。

旋转编写代码的时候可能会出现这样的情况:

因为旋转的时候,坐标的映射无法使坐标连续,所以中间会出现背景色的花纹。此时处理的方法使用均值滤波。

均值滤波的算子如下:

要用均值滤波处理,首先得把旋转后的图像放进一个数组里面:

所以新数组是(wImage*sinΘ+hImage*cosΘ) x (wImage*cosΘ + hImage*sinΘ)

然后新数组中要忽略四个直角三角形,只读取图像部分,才能使用均值滤波。这里需要用到向量。

只要四个向量的夹角之和为360°,就说明d点在图像内。

判断d点在图像在图像内,并且该色块的值等于背景色的时候,使用均值滤波

,将背景色除去。

判断点是否在某矩形上的代码。

#include<iostream>
#include<math.h>
using namespace std;

/**
 * 坐标点类,保存一个坐标
 */
class Position{
public:
	int x;// H
	int y;// W
	Position(int x,int y){
		this->x = x;
		this->y = y;
	}
};

class Vector{
public:
	int x;
	int y;
	Vector(int x,int y){
		this->x=x;
		this->y=y;
	}
	Vector(Position a,Position b){//根据两个点来求向量的坐标
		this->x=a.x-b.x;
		this->y=a.y-b.y;
	}
	double getabs(){//求向量的长度
		return sqrt(x*x+y*y);
	}
};

double get(Vector a,Vector b){
//	cout<<'('<<a.x<<','<<a.y<<')'<<"&&"<<'('<<b.x<<','<<b.y<<')'<<endl;
//	cout<<((double)(a.x)*(double)(b.x)+(double)(a.y)*(double)(b.y))/(double)(a.getabs()*b.getabs())<<endl;
	double _a=a.getabs(),_b=b.getabs();
	if(_a==0.0 ||_b==0.0){
		return -0.707107;//返回该值可以判断该点是否刚好为矩形的顶点。
	}
	return ((double)(a.x)*(double)(b.x)+(double)(a.y)*(double)(b.y))/(double)(_a*_b);
}

bool isImage(Position *p,int x, int y){
	Position d(x,y);
	Vector v[4]={Vector(p[0],d),Vector(p[1],d),Vector(p[2],d),Vector(p[3],d)};//创建四个向量
	cout<<acos(get(v[0],v[1]))+acos(get(v[0],v[3]))+acos(get(v[2],v[1]))+acos(get(v[2],v[3]))<<endl;
	//判断四个向量的夹角之和是否为2π
	if(fabs(acos(get(v[0],v[1])) + acos(get(v[0],v[3])) + acos(get(v[2],v[1])) + acos(get(v[2],v[3]))-6.28319)<0.0001){
		return true;
	}
	else return false;

}

int main(){
	Position p[4]={Position(0,0),Position(2,0),Position(2,2),Position(0,2)};//矩形的四个顶点的坐标
	int i=2,j=2;//判断点(i,j)是不是在矩形内
	Position d(i,j);//生成点d(i,j)
	if(isImage(p,i,j)){//判断d(i,i)是不是在矩形内,是返回true,否返回false。p是四个矩形的顶点。
		cout<<'('<<i<<','<<j<<')'<<' '<<1<<endl;
	}
	else{
		cout<<'('<<i<<','<<j<<')'<<' '<<0<<endl;
	}
	return 0;
}

均值滤波代码:

/**
 * Time:201505261947
 * 1 1 1
 * 1 0 1 /8 均值滤波,用于填充旋转图片时候空出来的坐标(即花纹)
 * 1 1 1
 */
void Processing(RGB_INT **n,int H,int W,int xPos,int yPos,Position *p){
	int mask[9]={
		1,1,1,
		1,0,1,
		1,1,1
	};
	int Coff,i,j,m,g,k,temp,MaskWH=3,MaskCoff=8;
	 k=(MaskWH-1)/2;
  	 for(i=k;i<H-k;i++){
	 	 for(j=k;j<W-k;j++){
			 if(isImage(p,i,j) && n[i][j].R==256){
				 Coff=0;
				for(m=-k;m<=k;m++){
					for(g=-k;g<=k;g++){
						Coff+=(BYTE)n[i+m][j+g].R * mask[(m+k)*MaskWH+(g+k)];
					}//for
				}//for
				if(Coff<0)n[i][j].R=n[i][j].G=n[i][j].B=0;
				else{
					temp=(BYTE)(Coff/MaskCoff);
					n[i][j].R=n[i][j].G=n[i][j].B=(BYTE)( Coff%MaskCoff==0 ? temp:temp+1 );
				}
			 }//if
		}//for
	}//for
	ShowImage(n,H,W,xPos,yPos,p);
}

逆时针旋转120度

逆时针旋转60度

逆时针旋转300度

放大两倍

缩小两倍:

数字图像处理程序汇总VC6.0源代码:http://download.csdn.net/detail/u013580497/8877185

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-03 04:38:00

【数字图像处理之四】图像的放大缩小旋转的相关文章

数字图像处理_图像二值化_jzcjedu

皮卡丘:“师兄! ” 师兄:“干嘛…?” 皮卡丘:“你帮我看看这个,这是我打车的发票,看起来有点不太清晰,老板说不给我报销…” 师兄:“你仿佛在特意逗我笑,这不是很清楚嘛!!! ” 皮卡丘:“我老板有强迫症,他说这个扫描之后不清楚,让我弄清晰点再给他,不然就不给我钱.师兄,你一定要帮我呀,不然以后都不能打车了.” 师兄:“不急,我先看看,我记得当初张康老师教过我对于这种信噪比很高的图像你要提取出想要的信息的话用二值化处理又简单又方便.“ 皮卡丘:“这样啊,快弄给我看看.“ 稍等,我开一下MATL

猫猫学IOS(一)UI之按钮操作 点击变换 移动 放大缩小 旋转

不多说,先上图片看效果,猫猫分享,必须精品 这个小程序主要实现点击方向键可以让图标上下左右动还有放大缩小以及旋转的功能,点击图片会显示另一张图片. 点击变换 其实用到了按钮的两个状态,再State Config中的Default还有Highlighted的两个状态下background内容图片的设置 其实就是按钮的几个状态: Default:默认状态 Highlighted:被点击时候的高亮状态 Selected:被选中的时候的状态 Disabled:不能使用的时候的状态 移动 - (IBAct

图片 滚动 放大缩小 旋转

需求就是页面浏览一张图片,要求提供放大.缩小.旋转的功能 这里实现的方式是使用jquery的一个iviewer插件 具体实现方式已经提供在下载包中,下载链接: 如果失效请联系QQ:1546224081,或者QQ:2651408273 ps几点: 1,使用文件前,做好相应css和js的映射. 2,mousewheel是iviewer-master的简介版. 3,更改mousewheel图表时,记得要更改jquery.iviewer.css的中的最后两行,以及相应的路径. 4,两个demo我都放在了

数字图像处理_图像基本运算

图像基本运算 1点运算 线性点运算是指输入图像的灰度级与输出图像呈线性关系.s=ar+b  (r为输入灰度值,s为相应点的输出灰度值).  当a=1,b=0时,新图像与原图像相同:  当a=1,b≠0时,新图像是原图像所有像素的灰度值上移或下移,是整个图像在显示时更亮或更暗:  当a>1时,新图像对比度增加:  当a<1时,新图像对比度降低:  当a<0时,暗区域将变亮,亮区域将变暗,点运算完成了图像求补: 非线性点运算是指输入与输出为非线性关系,常见的非线性灰度变换为对数变换和幂次变换

【数字图像处理】图像细化处理

图像细化 细化技术:把一个平面区域简化成图的结构形状表示法骨架:一种细化结构,它是目标的重要拓扑描述,具有非常广泛的应用.在图像识别或数据压缩时,经常用细化结构.例如:在识别字符之前,往往要先对字符作细化处理,求出字符的细化结构.细化的作用:目的将图像的骨架提取出来的同时,保持图像细小部分的连通性,对被处理的图像进行细化有助于突出形状特点和减少冗余信息量. 细化算法 细化算法:采取逐次去除边界的方法进行的,不能破化图像的连通性.通常选择一组结构元素对,不断在这些结构对中循环,如果所得结果不再变化

【数字图像处理】图像的平滑处理

图像平滑的目的 模糊:在提取较大目标前,去除太小细节,或将目标内的小间断连接起来. 消除噪声:改善图像质量,降低干扰. 平滑处滤波对图像的低频分量增强,同时削弱高频分量,用于消除图像中的随机噪声,起到平滑作用. 图像平滑处理的基本方法 领域平均法 领域加权平均法 选择式掩模法 中值滤波 领域平均法 模板在图像上移动,模板的中心对应目标像素点,在模板范围内对目标像素点进行卷积运算(对应系数乘对应像素点),然后相加除上模板大小得到均值,这个均值就是目标像素点处理后的值. 如图,对5行四列的图像进行3

数字图像处理,图像锐化算法的C++实现

http://blog.csdn.net/ebowtang/article/details/38961399 之前一段我们提到的算法都是和平滑有关, 经过平滑算法之后, 图像锐度降低, 降低到一定程度, 就变成了模糊. 今天我们反其道行之, 我们看看锐化是怎么做的. 这里的锐化, 还是的从平滑谈开去.我们先来观察原来的图像和平滑图像的区别: 原图 raw: 模糊图 blur: _________________________________________________________ 源图

Winform 图片鼠标滚动查看(放大,缩小,旋转,拖动查看)[日常随笔]

方法千千万,我只是其中一笔[通过控制PictureBox来控制图片,图片完全施展在控件中]...几久不做,还真有点陌生! 窗体构造中添加鼠标滚动: 1 /// <summary> 2 /// 窗体构造方法 3 /// </summary> 4 public CandidateForm() 5 { 6 InitializeComponent(); 7 this.MouseWheel += new MouseEventHandler(CandidateForm_MouseWheel);

数字图像处理_图像的采样和量化

基础知识储备 采样;就是把一幅连续图像在空间上分割成M×N个网格,每个网格用一亮度值来表示.一个网格称为一个像素.M×N的取值满足采样定理. 量化;就是把采样点上对应的亮度连续变化区间转换为单个特定数码的过程.量化后,图像就被表示成一个整数矩阵.每个像素具有两个属性:位置和灰度.位置由行.列表示.灰度表示该像素位置上亮暗程度的整数.此数字矩阵M×N就作为计算机处理的对象了.灰度级一般为0-255(8bit量化).量化示意图(a)为量化过程(b)为量化为8bit 在现实生活中,采集到的图像都需要经