均值模糊调试遇到的问题

<span style="font-family: KaiTi_GB2312; font-size: 12px; background-color: rgb(255, 255, 255);">内存对齐函数(Core.cpp):</span>


这个内存对齐函数式针对VS2015版,针对Linux系统可能需要相应的修改吧?对应的头文件是:<malloc.h>
/// <summary>
/// 分配内存函数,以32字节对齐。
/// </summary>
/// <param name="Size">需要使用的内存大小(以字节为单位)。</param>
/// <param name="ZeroMemory">内存数据是否进行清零处理 。</param>
/// <returns>返回所分配内存的指针,失败则返回NULL。</returns>
void *AllocMemory(unsigned int Size, bool ZeroMemory)	//	https://technet.microsoft.com/zh-cn/library/8z34s9c6
{
	void *Ptr = _aligned_malloc(Size, 32);	//考虑SSE,AVX等高级函数的需求,分配起始地址使用32字节对齐。其实_mm_malloc就是这个函数
	if (Ptr != NULL && ZeroMemory == true)
		memset(Ptr, 0, Size);
	return Ptr;
}

释放内存函数(FreeMemory):
/// <summary>
/// 释放内存。
/// </summary>
/// <param name="Ptr">内存数据的地址。</param>
void FreeMemory(void *Ptr)
{
	if (Ptr != NULL) _aligned_free(Ptr);		//	_mm_free就是该函数
}

按照指定的方式扩展各坐标的有理值

/// <summary>
/// 按照指定的边缘模式计算扩展后各坐标的有理值
/// </summary>
/// <param name="Length">原始序列的长度。</param>
/// <param name="Left">左侧需要扩展的长度。</param>
/// <param name="Right">右侧需要扩展的长度。</param>
/// <param name="Edge">边缘扩展的模式。</param>
/// <returns>返回扩展后对应的坐标。</returns>
int *GetExpandPos(int Length, int Left, int Right, EdgeMode Edge)
{
	if (Left < 0 || Length < 0 || Right < 0) return NULL;//不合适的输入返回NULL
	int *Pos = (int *)AllocMemory((Left + Length + Right) * sizeof(int), false);//创建大小为(Left+Length+Right)的整形的内存,并不做清零操作
	if (Pos == NULL) return NULL;//如果内存没有创建成功,就返回NULL。

	int X, PosX;//X为自变量,变化大小为Left+Length+Right,PosX未知
	for (X = -Left; X < Length + Right; X++)   
	{
		if (X < 0)    //如果X小于零           //扩展后左侧像素的处理
		{
			if (Edge == EdgeMode::Tile)   //重复边缘像素
				Pos[X + Left] = 0;    //左侧的部分赋值零,并且坐标由-Left到0变为了0到Left。
			else                          //做镜像数据
			{
				PosX = -X;           //PosX为X取整之后的值,比如最左边为—Left,PosX变为Left
				while (PosX >= Length) PosX -= Length;// 当这个数值大于原来的长度(扩展前)的时候,PosX=PosX-Length
				Pos[X + Left] = PosX;
			}
		}
		else if (X >= Length)   //如果说X>=Length,也就是说对于扩展后右侧的数据处理
		{
			if (Edge == EdgeMode::Tile)         //重复边缘像素
				Pos[X + Left] = Length - 1; //坐标由[Length,Length+Right]变化为[Left+Length,Left+Length+Right],并且赋值为Length-1
			else                                //镜像处理
			{
				PosX = Length - (X - Length + 2);//
				while (PosX < 0) PosX += Length;
				Pos[X + Left] = PosX;
			}
		}
		else      //对于原像素的处理,值还是原来的值,坐标变化[0,Length]变化为[Left,Length+Left]
		{
			Pos[X + Left] = X;
		}
	}
	return Pos;
}

unsigned char  *ColSum, *Diff; 
ColSum = (unsigned char  *)malloc(Width * Channel * sizeof(unsigned char )); //开辟行内存地址
Diff   = (unsigned char  *)malloc((Width - 1) * Channel * sizeof(unsigned char ));//开辟行内存地址-1
	
unsigned char 这样的数据类型:均值模糊的结果

int  *ColSum, *Diff; 
ColSum = (int *)malloc(Width * Channel * sizeof(int )); //开辟行内存地址
Diff   = (int  *)malloc((Width - 1) * Channel * sizeof(int ));//开辟行内存地址-1
int型数据类型产生的均值模糊的结果:






修改开辟内存和数据类型

模糊半径为2没有乱七八糟的噪点,其余的模糊半径就会出现上图所示的模糊问题。
最后发现就是数据定义的时候的数据类型和内存对齐的问题,采用32位对齐。问题解决:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无敌三角猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值