根据结构张量能区分图像的平坦区域、边缘区域与角点区域。

此算法也算是计算机科学最重要的32个算法之一了。链接的文章中此算法名称为Strukturtensor算法,不过我搜索了一下,Strukturtensor这个单词好像是德语,翻译过来就是structure tensor结构张量了。

此处所说的张量不是相对论或黎曼几何里的张量,黎曼几何的张量好多论文都叫张量场了。也不是数学界还没研究明白的对矩阵进行扩展的高阶张量,主要是张量分解。这里的结构张量就是一个矩阵,一个对图像像素进行组织的数据结构而已。

像素组织而成的矩阵如下:

这个公式太常见了,在harris角点检测中就用到了。其中Ix,Iy就是原对原图像在x和y方向求得的偏导。

然后求矩阵E的行列式K和迹H。然后根据K和H的关系就能区分图像的区域模式了。

模式分以下三类:

平坦区域:H=0;

边缘区域:H>0 && K=0;

角点区域:H>0 && K>0;

harris角点检测就用到了第三类判断。

当然,在实际应用的时候H和K的值肯定都不会是理想,所以我用的都是近似判断。

处理结果如下:

原图:

平坦区域:

边缘区域:

角点区域(好像也不全角点,求角点还是harris好了):

结构张量行列式与迹的关系:

其中红框为平坦区域,黄框为边缘区域,铝框为角点区域。

matlab代码如下:

clear all; close all; clc;

img=double(imread('lena.jpg'));
[m n]=size(img);
imshow(img,[]) [Ix Iy]=gradient(img);
Ix2=Ix.^;
Iy2=Iy.^;
Ixy=Ix.*Iy; k=;
lambda=zeros(m*n,);
for i=:m
for j=:n
st=[Ix2(i,j) Ixy(i,j);Ixy(i,j) Iy2(i,j)]; %结构张量
K=det(st); %求行列式
H=trace(st); %求迹
%所有的判断都是近似的
% if H< %认为是平坦区域
% if H> && abs(K)<0.01*^(-) %认为是边缘区域
if H> && abs(K)>0.01*^(-) %认为是角点区域
img(i,j)=;
end lambda(k,:)=[K H];
k=k+;
end
end figure;
plot(lambda(:,),lambda(:,),'.');
ylabel('trace');xlabel('det'); figure;
imshow(img,[])

matlab练习程序(结构张量structure tensor)的更多相关文章

  1. paper 134:结构张量structure tensor(二)

    根据结构张量能区分图像的平坦区域.边缘区域与角点区域. 此算法也算是计算机科学最重要的32个算法之一了.链接的文章中此算法名称为Strukturtensor算法,不过我搜索了一下,Strukturte ...

  2. paper 133:结构张量Structure Tensor(一)

    1.结构张量的作用:       能够区分图像中的平坦区域,边缘,角点: 2.图像中的结构张量的定义    1)是一个矩阵:    2)与图像的水平,垂直梯度有关,定义如下: 在MATLAB中,可以用 ...

  3. C++程序结构---1

    C++ 基础教程Beta 版 原作:Juan Soulié 翻译:Jing Xu (aqua) 英文原版 本教程根据Juan Soulie的英文版C++教程翻译并改编. 本版为最新校对版,尚未定稿.如 ...

  4. TensorFlow从0到1之程序结构(5)

    TensorFlow 与其他编程语言非常不同. 首先通过将程序分为两个独立的部分,构建任何拟创建神经网络的蓝图,包括计算图的定义及其执行.起初这对于传统程序员来说看起来很麻烦,但是正是图定义和执行的分 ...

  5. AI - TensorFlow - 张量(Tensor)

    张量(Tensor) 在Tensorflow中,变量统一称作张量(Tensor). 张量(Tensor)是任意维度的数组. 0阶张量:纯量或标量 (scalar), 也就是一个数值,例如,\'Howd ...

  6. Cef应用程序结构

    Application Structure 应用程序结构 Every CEF3 application has the same general structure. Provide an entry ...

  7. 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定

    前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...

  8. 谈谈.net模块依赖关系及程序结构

    技术为解决问题而生. 上面这个命题并非本文重点,我将来有空再谈这个.本文也并非什么了不起的技术创新,只是分享一下我对.net模块依赖关系及程序结构方面的一些看法.先看一个最最简单的hello worl ...

  9. 【C语言入门教程】1.1 基本程序结构

    基本程序结构就是从上至下顺序执行的程序,C语言程序必须有且只有一个主函数,程序从主函数开始执行,直到主函数结束.下例是根据半径求圆形面积的程序源代码. #include <stdio.h> ...

随机推荐

  1. tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作

    tornado 06 数据库—ORM—SQLAlchemy——基本内容及操作 一. ORM #在服务器后台,数据是要储存在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办?是不 ...

  2. IntersectionObserver

    创建对象 var io = new IntersectionObserver(callback, option); IntersectionObserver是浏览器原生提供的构造函数,接受两个参数:c ...

  3. python之函数(一)

    python有很多内置函数,可以直接调用.比如type(), len(), range(),max(), min(), filter().内置函数我们就先不多提,我们主要介绍自定义函数. 1. 函数的 ...

  4. C++_IO与文件4-简单文件的输入与输出

    通过键盘输入和屏幕输出被称为是控制台输入/输出: 更广义上讲控制台的输入/输出也是一种特殊的文件输入/输出: 当使用cin进行输入时,程序将输入视为一系列的字节,其中的每个字节都被解释成字符编码: 不 ...

  5. C++_异常1-调用abort()

    异常是相对较新的C++功能,有些老式编译器可能没有实现.另外有些编译器可能默认关闭这一特性,需要使用编译器选项来打开它. 这里先讨论一个基本问题: 2.0 * x * y / (x+y) 如果y是x的 ...

  6. js请求数据的例子

    //es6实现方式 const getData = async ()=> { //同步请求数据 const res1=await this.$http.get("https://www ...

  7. 【Python】urlopen小结

    0X00   简介 urlopen是urllib的的一个方法,它属于类文件对象,具有文件对象的方法,如read()等,同时也具有自身的一些方法: 1.info() 返回响应包的头信息 2.info() ...

  8. 设计模式学习总结(七)适配器模式(Adapter)

    适配器模式主要是通过适配器来实现接口的统一,如要实现国内手机在国外充电,则需要在不同的国家采用不同的适配器来进行兼容! 一.示例展示: 以下例子主要通过给笔记本电脑添加类似手机打电话和发短信的功能来详 ...

  9. UI设计师与VI设计师的区别

    企业视觉形象(CorporateVisualImage)与企业视觉形象识别(VI)并不是一个概念.前者是企业与生俱来的客观存在要素,也就是说一个企业无论是否制定了它的VI,也无论其所制定的VI是否成功 ...

  10. MyISAM的前缀压缩索引在索引块中的组织方式

    纯粹自己的理解,哪位大佬看到了还请指正. 首先贴一张<高性能MySQL>中的一段话: 这句话的意思是说,MyISAM使用b+树组织索引.也就是说无论索引压缩与否,组织方式一定是B+树. 下 ...