图像处理基础-拉普拉斯锐化

2020-10-26  本文已影响0人  天叔

一、拉普拉斯算法

拉普拉斯算法,数学描述上是求二阶导数,如果忘了高数里的二阶导,可以理解为简单的模板算子:

4领域和8领域的拉普拉斯算子: 四领域拉普拉斯算子: 八领域拉普拉斯算子: 拉普拉斯锐化计算: 实现效果:

二、拉普拉斯算法实现:

代码看起来多,其实核心逻辑非常简单,比前面讲的高斯算子简单多了

#include"f_LaplaceSharpen.h"
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<stdio.h>
#include"Commen.h"

int f_LaplaceSharpen(unsigned char* srcData,int width, int height,int stride,int mode)
{
    int ret = 0;
    unsigned char* tempData = (unsigned char*)malloc(sizeof(unsigned char) * height * stride);
    int offset = stride - width * 4;
    int pos;
    memcpy(tempData, srcData, sizeof(unsigned char) * height * stride);
    if(mode == 0)
    {
        for(int j = 1; j < height - 1; j++)
        {
            for(int i = 1; i < width - 1; i++)
            {
                pos = i * 4 + j * stride;
                srcData[pos] = CLIP3(tempData[pos] + (tempData[pos] * 4 - tempData[pos - stride] - tempData[pos - 4] - tempData[pos + 4] - tempData[pos + stride]), 0, 255);
                pos++;
                srcData[pos] = CLIP3(tempData[pos] + (tempData[pos] * 4 - tempData[pos - stride] - tempData[pos - 4] - tempData[pos + 4] - tempData[pos + stride]), 0, 255);
                pos++;
                srcData[pos] = CLIP3(tempData[pos] + (tempData[pos] * 4 - tempData[pos - stride] - tempData[pos - 4] - tempData[pos + 4] - tempData[pos + stride]), 0, 255);
            }
        }
    }
    else
    {
        for(int j = 1; j < height - 1; j++)
        {
            for(int i = 1; i < width - 1; i++)
            {
                pos = i * 4 + j * stride;
                srcData[pos] = CLIP3(tempData[pos] + (tempData[pos] * 8 - tempData[pos - stride] - tempData[pos - 4] - tempData[pos + 4] - tempData[pos + stride] - tempData[pos - 4 - stride] - tempData[pos + 4 - stride] - tempData[pos - 4 + stride] - tempData[pos + 4 + stride]), 0, 255);
                pos++;
                srcData[pos] = CLIP3(tempData[pos] + (tempData[pos] * 8 - tempData[pos - stride] - tempData[pos - 4] - tempData[pos + 4] - tempData[pos + stride] - tempData[pos - 4 - stride] - tempData[pos + 4 - stride] - tempData[pos - 4 + stride] - tempData[pos + 4 + stride]), 0, 255);
                pos++;
                srcData[pos] = CLIP3(tempData[pos] + (tempData[pos] * 8 - tempData[pos - stride] - tempData[pos - 4] - tempData[pos + 4] - tempData[pos + stride] - tempData[pos - 4 - stride] - tempData[pos + 4 - stride] - tempData[pos - 4 + stride] - tempData[pos + 4 + stride]), 0, 255);
            }
        }
    }
    free(tempData);
    return ret;
};
上一篇 下一篇

猜你喜欢

热点阅读