<span style="font-family: KaiTi_GB2312; font-size: 12px; background-color: rgb(255, 255, 255);">内存对齐函数(Core.cpp):</span>
<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位对齐。问题解决: