现在的位置: 首页 > 综合 > 正文

一些图像变换1402,旋转、缩放、二值化、边界涂黑等

2018年11月05日 ⁄ 综合 ⁄ 共 3952字 ⁄ 字号 评论关闭

原型说明:

包含头文件:

#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;
}

抱歉!评论已关闭.