专栏首页音视频技术学习笔记图像处理基础-拉普拉斯锐化

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

一、拉普拉斯算法

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 图像处理基础-图像边缘检测

    图像处理经常会用到这张赫赫有名的图片,这位lena女士的照片原本用在“花花公子”的杂志封面上,机缘巧合被当做测试素材,广泛用在图形处理领域。

    sumsmile
  • 15.opengl高级-混合

    纹理缓和的计算也不复杂,根据alpha通道值做叠加或减除融合,详细可参考opengl-混合

    sumsmile
  • 12. opengl模型加载-assimp编译(mac)

    源码编译有两处坑: 2.1 Ver 3.3.1源码有笔误,编译报错,4.1+版本无此问题,亲测

    sumsmile
  • AMD 2020处理器产品线曝光: Zen2 APU与Zen 3锐龙4000

    Planet 3DNow上关于AMD新处理器代号和路线图的文章引发广泛关注,提供了很多此前不曾为人了解的信息。其中,ThreadRipper产品线第三代产品代号...

    Debian中国
  • Redis持久化详解

    随着写操作的不断增加,AOF文件会越来越大。例如你递增一个计数器100次,那么最终结果就是数据集里的计数器的值为最终的递增结果,但是AOF文件里却会把这100次...

    dogfei
  • LeetCode 1311. 获取你好友已观看的视频(BFS+哈希map+vector排序)

    给你数组 watchedVideos 和 friends ,其中 watchedVideos[i] 和 friends[i] 分别表示 id = i 的人观...

    Michael阿明
  • 解决keras backend 越跑越慢问题

    Keras运行迭代一定代数以后,速度越来越慢,经检查是因为在循环迭代过程中增加了新的计算节点,导致计算节点越来越多,内存被占用完,速度变慢。

    砸漏
  • 转 (总结)密码破解之王:Ophcrack彩虹表(Rainbow Tables)原理详解(附:120G彩虹表下载)

    原文地址:http://blog.csdn.net/u011202334/article/details/50585777

    仙士可
  • 深入浅出java静态代理和动态代理

    代理模式,是常用的设计模式。特征是,代理类与委托类有相同的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类。以及事后处理消息。

    Java团长
  • 用于重新编译的工具和命令

    1.SQL Prifiler:捕捉事件类型为SP和T-SQL的事件(Starting、Stmtcompleted、Recompile、Completed、Cac...

    用户1217611

扫码关注云+社区

领取腾讯云代金券