【数字图像处理之四】图像的放大缩小旋转
来源:互联网 发布:考务管理系统软件java 编辑:程序博客网 时间:2024/05/16 01:04
缩放放大:
修改红框里面的参数,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;// Hint y;// WPosition(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}//forif(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}//forShowImage(n,H,W,xPos,yPos,p);}
逆时针旋转120度
逆时针旋转60度
逆时针旋转300度
放大两倍
缩小两倍:
数字图像处理程序汇总VC6.0源代码:http://download.csdn.net/detail/u013580497/8877185
0 0
- 【数字图像处理之四】图像的放大缩小旋转
- 数字图像处理:5.放大、缩小图像
- [数字图像处理]数字图像的有理数倍缩放(缩小与放大)
- 数字图像的放大和缩小
- ImageView实现图像的放大缩小和旋转功能
- 数字图像处理:6.旋转图像
- [数字图像处理]数字图像的整数倍缩小
- android之imageView放大缩小与旋转
- 关于放大缩小的处理
- 简单的旋转,放大,缩小 (HTML5)
- 【数字图像处理学习笔记之四】图像腐蚀、膨胀
- ---Transform---放大缩小旋转
- java 图片数字图像处理之图片缩小
- VC数字图像处理编程讲座之四--BMP图像显示的特效操作
- 一个实用的图像放大缩小程序
- java 图像的放大与缩小
- OpenCv 图像的放大和缩小
- [原型设计]Axure制作图像的放大与缩小效果的四种方式
- POJ1659Havel-Hakimi定理判断图的可图性
- 中文编码问题
- Photoshop常用快捷键(2)
- 关于QT的系统总结
- 数据结构 ---- 二叉搜索树
- 【数字图像处理之四】图像的放大缩小旋转
- android得到控件的高度
- 南阳oj 题目98 成绩转换
- poj3253Fence Repair 解题题解
- [Keyword]static/const/volatile/intterupt的使用及注意
- 第一个Android程序 -- HelloAndroid(续)
- 插入排序
- Rust中文翻译17
- 好好搞学术