一些图像变换1402,旋转、缩放、二值化、边界涂黑等
2014-11-30 20:21
381 查看
原型说明:
包含头文件:
源码:
包含头文件:
#define WHITE 255 #define BLACK 0 #define PI 3.1415926535897932384626433 #include<stdio.h> #include<malloc.h> #include<math.h> int imrotate(unsigned char *imagein,unsigned char *imagert,float angle,int sizein[2],int size[2],int inter); int imzoom(unsigned char *imagein, unsigned char *imageout,int sizein[2],int size[2],int inter); int imboundaryblack(unsigned char *imagein,int radius,int size[2],int mood); int imthresh(unsigned char *image,int thresh,int size[2]);
源码:
#include"imtr.h" int imrotate(unsigned char *imagein,unsigned char *imagert,float angle,int sizein[2],int size[2],int inter) { /* size[0] = (int)( sizein[1] * fabs(sin(angler)) + sizein[0] * fabs(cos(angler)) ); size[1] = (int)( sizein[1] * fabs(cos(angler)) + sizein[0] * fabs(sin(angler)) ); */ int i,j; int x,y; int iu,iv; float u,v; float r,s; int coordmod[2]; if(angle > 0) { x = (int)(angle/(2*PI)); angle = angle - x * 2 * PI; } if(angle < 0) { x = (int)((-angle)/(2*PI)); angle = angle - x * 2 * PI; } if(angle >= 0 && angle < PI/2) { coordmod[0] = (int)( sizein[1] * sin(angle) ); coordmod[1] = 0; } if(angle < 0 && angle > -PI/2) { coordmod[0] = 0; coordmod[1] = (int)( sizein[0] * sin(-angle) ); } if(angle >=PI/2 && angle < PI) { coordmod[0] = (int)( sizein[0] * sin(angle - PI/2) + sizein[1] * cos(angle - PI/2) ); coordmod[1] = (int)( sizein[1] * sin(angle - PI/2) ); } if(angle >= -PI && angle <= -PI/2) { coordmod[0] = (int)( sizein[0] * sin(-angle - PI/2) ); coordmod[1] = (int)( sizein[0] * cos(-angle - PI/2) + sizein[1] * sin(-angle - PI/2) ); } if(inter == 1) { for(i = 0; i < size[1]; i++) { y = i - coordmod[1]; for(j = 0; j < size[0]; j++) { x = j - coordmod[0]; u = (float)( x * cos(angle) + y * sin(angle) ); v = (float)( y * cos(angle) - x * sin(angle) ); if( u < 1 || u >= (sizein[0]-2) || v < 1 || v >= (sizein[1]-2) ) { *(imagert+i*size[0]+j) = BLACK; } else { r = u - (int)u; s = v - (int)v; *(imagert+i*size[0]+j) = (int)( (1-r) * (1-s) * (*(imagein + (int)v * sizein[0] + (int)u) ) + (1-r) * s * (*(imagein + ((int)v + 1) * sizein[0] + (int)u) ) + (1-s) * r * (*(imagein + (int)v * sizein[0] + (int)u + 1) ) + r * s * (*(imagein + ((int)v + 1) * sizein[0] + (int)u + 1) ) ); } } } } if(inter == 0) { for(i = 0; i < size[1]; i++) { y = i - coordmod[1]; for(j = 0; j < size[0]; j++) { x = j - coordmod[0]; iu = (int)( x * cos(angle) + y * sin(angle) ); iv = (int)( y * cos(angle) - x * sin(angle) ); if(iu < 1 || iu >= (sizein[0]-2) || iv < 1 || iv >= (sizein[1]-2) ) { *(imagert+i*size[0]+j) = BLACK; } else { *(imagert+i*size[0]+j) = *(imagein + iv * sizein[0] + iu); } } } } return 0; } int imzoom(unsigned char *imagein, unsigned char *imageout,int sizein[2],int size[2],int inter) { int i,j; float scale[2]; float u,v,r,s; int iu,iv; scale[0] = (float)sizein[0]/size[0]; scale[1] = (float)sizein[1]/size[1]; if(inter == 1) { for(i = 0; i < size[1]; i++) { for(j = 0; j < size[0]; j++) { u = (float)( j * scale[0] ); v = (float)( i * scale[1] ); if( u < 1 || u >= (sizein[0]-2) || v < 1 || v >= (sizein[1]-2) ) { *(imageout+i*size[0]+j) = BLACK; } else { r = u - (int)u; s = v - (int)v; *(imageout+i*size[0]+j) = (int)( (1-r) * (1-s) * (*(imagein + (int)v * sizein[0] + (int)u) ) + (1-r) * s * (*(imagein + ((int)v + 1) * sizein[0] + (int)u) ) + (1-s) * r * (*(imagein + (int)v * sizein[0] + (int)u + 1) ) + r * s * (*(imagein + ((int)v + 1) * sizein[0] + (int)u + 1) ) ); } } } } if(inter == 0) { for(i = 0; i < size[1]; i++) { for(j = 0; j < size[0]; j++) { iu = (int)( j * scale[0] ); iv = (int)( i * scale[1] ); if(iu < 1 || iu >= (sizein[0]-2) || iv < 1 || iv >= (sizein[1]-2) ) { *(imageout+i*size[0]+j) = BLACK; } else { *(imageout+i*size[0]+j) = *(imagein + iv * sizein[0] + iu); } } } } return 0; } int imboundaryblack(unsigned char *imagein,int radius,int size[2],int mood) { int i,j; int bac,b; int **boundary = (int **)calloc(2*size[1],sizeof(int)); for( i = 0; i < size[1]; i++ ) { boundary[i] = (int *)calloc(2,sizeof(int)); } if(mood == 0) { for( i = 0; i < size[1]; i++) { bac = fabs((float)i - size[1]/2); if( bac >= radius) { boundary[i][0] = size[0]; boundary[i][1] = -1; } else { b = sqrt( (float)radius * radius - bac *bac ); boundary[i][0] = size[0]/2 - b; boundary[i][1] = size[0]/2 + b; } } } if(mood == 1) { for( i = 0; i < size[1]; i++) { if(i < radius || i > size[1] - radius - 1) { boundary[i][0] = size[0]; boundary[i][1] = -1; } else { boundary[i][0] = radius; boundary[i][1] = size[0] - radius -1; } } } for(i = 0; i < size[1]; i++) { for(j = 0; j < size[0]; j++) { if( j < boundary[i][0] || j > boundary[i][1] ) *(imagein + i * size[0] + j) = BLACK; } } for(i = 0; i < size[1]; i++) { free(boundary[i]); } free(boundary); return 0; } int imthresh(unsigned char *image,int thresh,int size[2]) { int i; for(i = 0; i < size[0]*size[1]; i++) { if(*(image + i) > thresh) *(image + i) = WHITE; else *(image + i) = BLACK; } return 0; }
相关文章推荐
- 对图像进行旋转、缩放等变换
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放详解
- 图像几何变换:旋转,缩放,斜切
- iOS开发的一些小技术:让UIImage有缩放功能、控制log的输出、xcode修改文件注释、随机数的使用、在UIImageView 中旋转图像、在Quartz中如何设置旋转点、创建.plist文件并存储
- html5学习笔记三:canvas中平移,缩放,旋转等图像变换问题
- 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放具体解释
- FLASH处理图像的移动、缩放、旋转、颜色变换的类推荐。
- 图像基本变换--- 平移、旋转、缩放、仿射变换、镜像
- FLASH处理图像的移动、缩放、旋转、颜色变换的类推荐。
- 【OpenCV】图像几何变换:旋转,缩放,斜切
- OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)
- 图像平移、缩放、旋转、插值 Matlab实现
- python 图像的形变, 旋转与缩放 (transform) (1)
- 图像处理之图像基本变化(平移、缩放、旋转)(Octave实现)
- 【OpenCV3图像处理】图像简单几何变换:旋转、平移、缩放
- GDI+图像的显示、裁剪、缩放、转置、镜像、旋转、变形
- 图像的旋转与缩放
- opencv 图像仿射变换 计算仿射变换后对应特征点的新坐标 图像旋转、缩放、平移
- 二维图形学的变换-平移、旋转、缩放 OpenGL
- 自定义控件(11)---Canvas的平移、旋转、缩放、错切、Matrix直接变换Canvas