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

原创 2015年07月09日 22:21:37

缩放放大:


修改红框里面的参数,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



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

相关文章推荐

图像旋转原理及实现

在一次数字图像处理课中,我接触到了图片旋转的一些原理,当时没完全想明白,课后通过一段时间的学习,终于完成了图片旋转的matlab程序。开始觉得应该挺简单的,但终究是纸上谈兵,在实现的过程中遇到很多问题...
  • lkj345
  • lkj345
  • 2016-01-21 17:57
  • 5800

[数字图像处理]数字图像的有理数倍缩放(缩小与放大)

1.序言       根据上两节的内容,我们已经实现了整数倍的扩大与缩小。链接给在下面,有需要的就点吧。        [数字图像处理]数字图像的整数倍扩大(数字图像插值)        ...

[数字图像处理]数字图像的整数倍缩小

1.理想的缩小法            与数字图像的整数倍扩大法一样,先在理想的情况下,研究理想的缩小法。以此作为目标,对简单的缩小法的效果进行分析。所以,还是与扩大法一个思路,首先,做出两个信号。 ...

【数字图像处理】<纯C++>读取、裁剪、缩放、旋转和存储8位bmp灰度图像

C++实现以下功能:1、实现对硬盘中的8位BMP图像的读取和存储;2、实现对指定矩形框区域图像的剪切;3、实现对任意形状图像的任意比例缩放;4、实现对任意形状图像的任意角度选装。 程序编辑环境:在vi...

【数字图像处理】C++读取、旋转和保存bmp图像文件编程实现

通过我这些天用C++读写bmp图像的经历,摸索再摸索,终于对bmp文件的结构、操作有了一定的了解,下面就大概介绍bmp图片纯C++的读取、旋转和保存的实现过程。 要用C++读取bmp图片文件,首...

java 图片数字图像处理之图片缩小

package test; import java.awt.Color; import java.awt.image.BufferedImage; import java.awt.image.Col...
  • hayre
  • hayre
  • 2016-01-31 22:24
  • 387

数字图像处理-空间域增强(四)(空间域滤波)

回过头来学习第三章--空间域图像增强--空间滤波。     空间滤波和空间滤波器的定义 使用空间模板进行的图像处理,被称为空间滤波。 模板本身被称为空间滤波器。  ...

《数字图像处理》学习笔记(四)--混合空间增强法(待修改)

这次试验问题很多,应该还是数据格式的问题,先发上来吧,放假回去先用Matlab做下,再改改。。。。。    下面对一幅人体骨骼扫描图进行混合空间增强(有点吓人)。。。我们的目标是通过图像锐化突出骨骼的...

OpenCV数字图像处理四:直方图均衡化 数组示例

步骤总结: 直方图均衡示例 clear all; close all; clc; I=[1 5 255 255 100 200 255 200;     17 254 255 100 10 10...

【数字图像处理】四.MFC对话框绘制灰度直方图

本文主要讲述基于VC++6.0 MFC图像处理的应用知识,主要结合自己大三所学课程《数字图像处理》及课件进行回忆讲解,主要通过MFC单文档视图实现点击弹出对话框绘制BMP图片的灰度直方图,再获取平均灰...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)