ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

双线性插值缩放图像

2021-01-25 20:57:03  阅读:200  来源: 互联网

标签:Src dh 缩放 Dest 线性插值 char int 图像 dw


最近做图像处理遇到图像太大,处理实时性交叉的问题。需要将图片进行缩小,以下是参考网上线性插值法进行图像缩小的一种算法,可以对3通道的RGB或者是yuv444进行缩放处理:

/*参数为:
 *返回图片的宽度(w_Dest),
 *返回图片的高度(h_Dest),
 *返回图片的位深(bit_depth),
 *源图片的数据(src),
 *源图片的宽度(w_Src),
 *源图片的高度(h_Src)
 *返回图片数据(dst),
 */
static int do_Stretch_Linear(int w_Dest,int h_Dest,int bit_depth,unsigned char *src,int w_Src,int h_Src,unsigned char *dst)
{
	int sw = w_Src-1, sh = h_Src-1, dw = w_Dest-1, dh = h_Dest-1;
	int B, N, x, y;
	int nPixelSize = bit_depth/8;
	unsigned char *pLinePrev,*pLineNext;
	unsigned char *pDest = (unsigned char *)malloc(w_Dest*h_Dest*bit_depth/8) ;
	unsigned char *tmp;
	unsigned char *pA,*pB,*pC,*pD;
	int i, j, k;
	for(i=0;i<=dh;++i)
	{
		tmp =pDest + i*w_Dest*nPixelSize;
		y = i*sh/dh;
		N = dh - i*sh%dh;
		pLinePrev = src + (y++)*w_Src*nPixelSize;
		pLineNext = (N==dh) ? pLinePrev : src+y*w_Src*nPixelSize;   
		
		for(j=0;j<=dw;++j)
		{
			x = j*sw/dw*nPixelSize;
			B = dw-j*sw%dw;
			pA = pLinePrev+x;
			pB = pA+nPixelSize;
			pC = pLineNext + x;
			pD = pC + nPixelSize;
			if(B == dw)
			{
				pB=pA;
				pD=pC;
			}
			for(k=0;k<nPixelSize;++k)
			{
				*tmp++ = ( unsigned char )( int )(
					( B * N * ( *pA++ - *pB - *pC + *pD ) + dw * N * *pB++
					+ dh * B * *pC++ + ( dw * dh - dh * B - dw * N ) * *pD++
					+ dw * dh / 2 ) / ( dw * dh ) );
			}
		}
	}
	
	memcpy(dst,pDest,w_Dest*h_Dest*nPixelSize);
	free(pDest);
	pDest = NULL;
	return 0;
}

标签:Src,dh,缩放,Dest,线性插值,char,int,图像,dw
来源: https://blog.csdn.net/dawudayudaxue/article/details/113139962

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有