图像处理之Hessian矩阵提取关键点

简介: 图像处理之Hessian矩阵提取关键点

一:大致的算法流程

1. 对每个像素点计算图像在X方向Y方向的二阶偏导数,计算图像的XY方向的导数

2. 根据第一步的计算结果,有Hessian Matrix计算D(h) = Ixx*Iyy - Ixy*Ixy

其中Ixx表示X方向的二阶偏导数

Iyy表示Y方向的二阶偏导数

Ixy表XY方向的二阶导数

3. 根据第二步计算出来的值使用3×3窗口实现非最大信号压制,

我的做法, 直接给了threshold值,这个其实不很对,真的懒,不想弄啦!

二:导数计算实现

关于一阶与二阶高斯偏导数计算请看这里:

http://blog.csdn.net/jia20003/article/details/16369143

三:程序效果

四:算法代码

package com.gloomyfish.image.harris.corner;
 
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;
 
import com.gloomyfish.filter.study.AbstractBufferedImageOp;
 
public class HessianFeatureDetector extends AbstractBufferedImageOp {
  
  private GaussianDerivativeFilter gdFilter;
  private double minRejectThreshold = 4.1; // (r+1)^2/r
  private List<HessianMatrix> pixelMatrixList;
  
  public HessianFeatureDetector()
  {
    gdFilter = new GaussianDerivativeFilter();
    pixelMatrixList = new ArrayList<HessianMatrix>();
  }
  
  @Override
  public BufferedImage filter(BufferedImage src, BufferedImage dest) {
    int width = src.getWidth();
        int height = src.getHeight();
        initSettings(height, width);
        if ( dest == null )
            dest = createCompatibleDestImage( src, null );
 
        int[] inPixels = new int[width*height];
        gdFilter.setDirectionType(GaussianDerivativeFilter.XX_DIRECTION);
        BufferedImage bixx = gdFilter.filter(src, null);
        getRGB( bixx, 0, 0, width, height, inPixels );
        extractPixelData(inPixels, GaussianDerivativeFilter.XX_DIRECTION, height, width);
        
        // YY Direction
        gdFilter.setDirectionType(GaussianDerivativeFilter.YY_DIRECTION);
        BufferedImage biyy = gdFilter.filter(src, null);
        getRGB( biyy, 0, 0, width, height, inPixels );
        extractPixelData(inPixels, GaussianDerivativeFilter.YY_DIRECTION, height, width);
        
        // XY Direction
        gdFilter.setDirectionType(GaussianDerivativeFilter.XY_DIRECTION);
        BufferedImage bixy = gdFilter.filter(src, null);
        getRGB( bixy, 0, 0, width, height, inPixels );
        extractPixelData(inPixels, GaussianDerivativeFilter.XY_DIRECTION, height, width);
        
        int[] outPixels = new int[width*height];
        int index = 0;
        for(int row=0; row<height; row++) {
          int ta = 0, tr = 0, tg = 0, tb = 0;
          for(int col=0; col<width; col++) {
            index = row * width + col;
            ta = 255;
            HessianMatrix hm = pixelMatrixList.get(index);
            double[] t = hm.getThreshold();
            if(t[0] > minRejectThreshold)
            {
              tr = 127;
            }
            else
            {
              tr = 0;
            }
            if(t[1] > minRejectThreshold)
            {
              tg = 127;
            }
            else
            {
              tg = 0;
            }
            if(t[2] > minRejectThreshold)
            {
              tb = 127;
            }
            else
            {
              tb = 0;
            }
                outPixels[index] = (ta << 24) | (tr << 16) | (tg << 8) | tb;
          }
        }
 
        setRGB( dest, 0, 0, width, height, outPixels );
        return dest;
  }
  
  private void initSettings(int height, int width)
  {
        int index = 0;
        for(int row=0; row<height; row++) {
          for(int col=0; col<width; col++) {
            index = row * width + col;
                HessianMatrix matrix = new HessianMatrix();
                pixelMatrixList.add(index, matrix);
          }
        }
  }
  
  private void extractPixelData(int[] pixels, int type, int height, int width)
  {
        int index = 0;
        for(int row=0; row<height; row++) {
          int ta = 0, tr = 0, tg = 0, tb = 0;
          for(int col=0; col<width; col++) {
            index = row * width + col;
            ta = (pixels[index] >> 24) & 0xff;
                tr = (pixels[index] >> 16) & 0xff;
                tg = (pixels[index] >> 8) & 0xff;
                tb = pixels[index] & 0xff;
                HessianMatrix matrix = pixelMatrixList.get(index);
                if(type == GaussianDerivativeFilter.XX_DIRECTION)
                {
                  matrix.setXx(new double[]{tr, tg, tb});
                }
                if(type == GaussianDerivativeFilter.YY_DIRECTION)
                {
                  matrix.setYy(new double[]{tr, tg, tb});
                }
                if(type == GaussianDerivativeFilter.XY_DIRECTION)
                {
                  matrix.setXy(new double[]{tr, tg, tb});
                }
          }
        }
  }
 
}

转载请注明!

相关文章
|
关系型数据库 Linux PostgreSQL
Linux centos8 docker中安装postgresql12.4及远程访问设置
Linux centos8 docker中安装postgresql12.4及远程访问设置
1077 0
|
12月前
|
Linux 开发工具 Android开发
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
ijkplayer是由Bilibili基于FFmpeg3.4研发并开源的播放器,适用于Android和iOS,支持本地视频及网络流媒体播放。本文详细介绍如何在新版Android Studio中导入并使用ijkplayer库,包括Gradle版本及配置更新、导入编译好的so文件以及添加直播链接播放代码等步骤,帮助开发者顺利进行App调试与开发。更多FFmpeg开发知识可参考《FFmpeg开发实战:从零基础到短视频上线》。
1172 2
FFmpeg开发笔记(六十)使用国产的ijkplayer播放器观看网络视频
|
6月前
|
人工智能 缓存 自然语言处理
electron35-vue3-deepseek客户端流式输出AI对话系统
Electron35-DeepSeek桌面端AI系统|vue3.5+electron+arco客户端ai模板。2025跨平台ai实战electron35+vite6+arco仿DeepSeek/豆包ai流式打字聊天助手。
245 3
|
10月前
|
机器学习/深度学习 人工智能 自然语言处理
GLM-4V-Flash:智谱 AI 免费开放的图像理解大模型 API 接口
智谱AI推出的GLM-4V-Flash是一款专注于图像理解的免费开放大模型,提供API接口支持用户上传图片URL或Base64编码图片获取详细的图像描述。该模型通过深度学习和卷积神经网络技术,简化了图像分析流程,提高了开发效率,适用于内容审核、辅助视障人士、社交媒体、教育和电子商务等多个应用场景。
2954 14
GLM-4V-Flash:智谱 AI 免费开放的图像理解大模型 API 接口
|
人工智能 自然语言处理 数据挖掘
利用AI集成工具提升工作效率的实践经验
随着人工智能技术的蓬勃发展,以及当今数字化快速发展的时代,人工智能的运用已经渗透到各个行业和工作领域中,大语言模型在自然语言处理领域的应用也愈发广泛,而且市面上涌现出一批AI集成工具,比如Langchain、Dify、llamaIndex、fastgpt、百炼等,它们为开发者提供了强大的支持和便利,极大地提升了AI模型的构建和管理效率。作为一名热衷于利用新技术提高工作效率的开发者,我也积极尝试将这些工具融入到我的日常工作中,以期望提升工作效率和质量,下面我将分享我是如何使用AI集成工具来提升工作效率的,以及实践经验和心得。
708 1
利用AI集成工具提升工作效率的实践经验
|
机器学习/深度学习 人工智能 监控
一文读懂deepSpeed:深度学习训练的并行化
DeepSpeed 是由微软开发的开源深度学习优化库,旨在提高大规模模型训练的效率和可扩展性。通过创新的并行化策略、内存优化技术(如 ZeRO)及混合精度训练,DeepSpeed 显著提升了训练速度并降低了资源需求。它支持多种并行方法,包括数据并行、模型并行和流水线并行,同时与 PyTorch 等主流框架无缝集成,提供了易用的 API 和丰富的文档支持。DeepSpeed 不仅大幅减少了内存占用,还通过自动混合精度训练提高了计算效率,降低了能耗。其开源特性促进了 AI 行业的整体进步,使得更多研究者和开发者能够利用先进优化技术,推动了 AI 在各个领域的广泛应用。
|
传感器 NoSQL 算法
ROS Moveit 配置全网最详细教程
本文是关于ROS Moveit配置的全网最详细教程,提供了一键安装脚本,以及如何使用Moveit进行机器人运动规划的详细步骤和说明。文中还深入解析了Moveit的配置包文件、Moveit的源码,以及如何使用不同的运动规划算法(如CHOMP、LERP、STOMP)进行路径规划。
2148 1
ROS Moveit 配置全网最详细教程
|
算法 Python
群智能算法:【WOA】鲸鱼优化算法详细解读
本文详细解读了鲸鱼优化算法(WOA),这是一种受鲸鱼捕食行为启发的新兴群体智能优化算法,具有强大的全局搜索能力和快速收敛速度。文章分为五个部分,分别介绍了引言、算法原理、主要步骤、特点及Python代码实现。通过模拟鲸鱼的捕食行为,该算法能够在复杂的优化问题中找到全局最优解。
|
人工智能
本地离线部署大模型知识库OLLAMA+Anything(保姆级)
本地离线部署大模型知识库OLLAMA+Anything(保姆级)
4827 3
|
JavaScript Java 测试技术
基于SpringBoot+Vue的服装生产管理附带文章和源代码
基于SpringBoot+Vue的服装生产管理附带文章和源代码
108 1