2017-12-15 15:00:53 v_ahawodouliyoutang 阅读数 1712
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19174 人正在学习 去看看 张立铜

刚刚接触到数字图像处理,跟着导师做相关项目,现在只是对图像分割技术有所了解,如果写的不对的地方还请大家指出,谢谢。

参考的课本  数字图像处理(刚萨雷斯)

我对图像边缘检测的理解:人的视觉上就是把图像中的一座房子的边缘给画出来,大多数是房子的线条,这是宏观上的理解。让我们抽象到微观世界中,为什么能够检测出一条线呢?那是因为存在灰度级间断,就是说这条线两边的像素点都处于一个阶跃跳变状态(一部分显示黑,一部分显示白色,可以想象成一个台阶吧),那是理想模型,往往是因为物理硬件问题是无法达到骤变的效果,而是一个斜坡式的上升。那么我们可以对它进行求导了。一阶导数:可以判断是否是边界   二阶导数:可以判断是在黑的那部分还是白的那部分。

明白了抽象状态的边缘组成状况,那么可以去拿算子来对图片进行检测了。

简单说一下算子吧,可以理解为一个模(mu)子,也就是个模型,你拿着这个模子从图像的左上角,从左往右,一行一行的进行匹配,中间会进行一个计算,算出的值如果大于阈值的话那么就会报警说:“我是边缘“,然后把那个像素的值改成256,如果不是边缘的话,那就把值设置成0。基本的理解是这样吧。

Roberts,Prewitt,Sobel算子都是比较传统的算子相对来说比较好理解,课本上讲的比较详细。提供一下matlab实现的基本方法吧:

1.读入图片数据
2.实现图像矩阵的归一化操作  mat2gray(img) 
3.设置一个图像的边缘像素
4.经过roberts算子得到的每个像素的值
5.设置阈值
进入双层for循环,让3*3算子一行一行进行遍历 ,遍历之后执行算子,然后将数值对阈值进行比对,如果超过那么为白 ,如果没有超过为黑。最后输出

在图像处理中噪声的影响其实是很大的,对于loG算子和canny算子都先进行了高斯滤波,目的是让图像变得更平滑(实现的话可以采用edge算法)

(edge算法只能处理double的图形 ,找到的方法是先对图像进行二值变化(im2bw),然后再去对图形进行double转换 然后再使用edge方法)edge方法封装了这些算子,方便实用........


第一次写博客,发现缺少实验数据,同时还是对理论有所欠缺(例如在canny和loG算子上没有更深入的理解内核,博主一会仔细看看,就不写了).......我感觉应该会有问题的,请大家指正,谢谢。


2015-12-03 19:19:43 fanfangyu 阅读数 9128
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19174 人正在学习 去看看 张立铜
1.医学图像处理的基本流程:图像预处理、特征提取、分类。其算法的设计关键为特征提取和分类两部分。
2.疾病的诊断取决于对医学图像的获取和医学图像的解释。
3.主要研究工作为利用图像处理技术,通过形状、颜色、纹理以及与周围组织的关系等数据信息的处理,来对图像进行准确的分析,以此区别出正常和异常的医学图像
4.研究目的及意义:不同模式的图像信息因其成像原理不同具有各自的特点,存在对比度和分辨率的差异;成像设备、患者体位移动、形状的复杂性和易变性使得医学图像不明确、不连续,数据量大。
5.特征提取:对研究对象固有的、本质的及重要的特征属性进行测量并将结果数值化,或将对象分解并符号化,形成特征矢量或符号串、关系图的过程。
6.图像特征:形状:利用提取图像对象的边缘信息来获取,主要方法为Roberts、Prewitt、Sobel算子、Laplacian边缘检测算子以及Cannv算子等。
7.纹理特征:纹理是目标图像的重要特征,可以认为是灰度或颜色在空间分布的规律所形成的图案
8.医学图像的特点:1多模态性(解剖图像;不同功能活动状况的功能图像)
                 2灰度上的模糊性(内部因素,牙齿和股骨的灰度值在密度上的区别;外部因素:噪声的干扰)
                 3既有局部效应
                 4不确定性特点
9.医学图像的特征提取:颜色、纹理、形状
10.形状特征:基于边界利用形状的外部边缘(傅里叶描述子、链码、边界矩、边近界似)、基于区域利用形状的全部区域(矩不变量,还有区域的面积、形状的纵横比、形状矩、几何矩)  
基于边界的特征提取:一阶微分Robert、Prewitt、Sobel算子
                       二阶微分Laplacian边缘检测算子
                       基于最优方法算子Canny
基于区域的特征提取:似圆度(C=P^2/4∏A目标物体的周长平方和其面积之比,描述物体的形状和圆的近似度,C值越大,目标物体的形状越复杂)
                       转动惯量NMI
                       几何矩(利用目标所占区域的矩作为形状描述参数)
11.纹理特征:纹理能够对视觉图像中不同区域的结构、方向、粒度和规则性的差异进行有效的描述,符合人类的视觉特性。纹理不仅包含了物体表面性质或特征,还在一定程度上反映他们和环境的关系,因此,纹理特征在表述灰度统计信息之余,还能够体现出结构信息和空间分布。
纹理可以分为两类:a反复出现,方向性明确的结构性纹理,这种纹理的基元排列比较规则
                  B随机性纹理,通过统计特征给出。
方法:统计(一阶统计量一阶灰度直方图,在实际应用中,取整个直方图作为纹理特征是没有必要的,通常提取几个重要特征,主要包括关于原点的r阶矩、关于均值的r阶中心矩、扭曲度、峰度、熵;二阶统计量灰度共生矩阵,是考虑处于几何位置的一对对像素的灰度相关性并以这一对对像素出像某种灰度的条件概率来表征纹理,可以定量的描述特征,能量、熵、惯性矩、相关、局部平稳)和结构
灰度共生矩阵和小波变换
2018-07-05 14:05:50 qq_26996385 阅读数 1304
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19174 人正在学习 去看看 张立铜

图像分割的目的是将感兴趣的物体从图片中提取出来,分割的算法有很多种,基本都是围绕三要素:颜色、形状、纹理去提取。

一般我们常用颜色和形状,因为纹理的数据比较难获取(C#语言下资源很少)

Opencv3.*以上版本是存在灰度共生矩阵的函数的,很遗憾的是Emgucv下我没找到灰度共生矩阵相关,虽然实现上应该挺简单的。最后通过同为C#下的图像处理库Afroge实现,曲线救国。完整可获取参数如下图所示:


获取到3个色特征以及6个纹理特征后我们就可尝试进行分类判断了。浅浅尝试后效果不错。

原图:

目标分类1:

目标分类2:



初开博客,目的是交流与合作,本人QQ:273651820。

2016-12-04 20:44:55 TTTTzTTTT 阅读数 1759
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19174 人正在学习 去看看 张立铜
  • 如果要调用外接的USB摄像头获取图像通常使用OpenCV来调用,如何调用摄像头请参考本人的另一篇博客如果用OpenCV调用USB摄像头,如果不是,读取本地图片和视频进行图像处理和分析也通常用OpenCV来进行。

  • 如果要进行3D建模需要使用OpenGL库来编程,NeHe教程里推荐使用SOIL库来加载纹理(SOIL官方主页)直接使用SOIL_load_OGL_texture函数或者其他函数就行了(如果用SOIL加载纹理),这里主要是加载本机的各种格式的图片比较方便,如果对于已经读取到内存中的Mat类,如何将其记载为纹理呢??以下来详细介绍之。


对于一个已经存在于内存中的cv::Mat mat0(Mat类详解点这里)可以使用一下函数返回绑定的textureID:

GLuint matToTexture(cv::Mat mat, GLenum minFilter,
    GLenum magFilter, GLenum wrapFilter)
{
    // Generate a number for our textureID's unique handle
    GLuint textureID;
    glGenTextures(1, &textureID);

    // Bind to our texture handle
    glBindTexture(GL_TEXTURE_2D, textureID);

    // Catch silly-mistake texture interpolation method for magnification
    if (magFilter == GL_LINEAR_MIPMAP_LINEAR ||
        magFilter == GL_LINEAR_MIPMAP_NEAREST ||
        magFilter == GL_NEAREST_MIPMAP_LINEAR ||
        magFilter == GL_NEAREST_MIPMAP_NEAREST)
    {
        cout << "You can't use MIPMAPs for magnification - setting filter to GL_LINEAR" << endl;
        magFilter = GL_LINEAR;
    }

    // Set texture interpolation methods for minification and magnification
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);

    // Set texture clamping method
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapFilter);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapFilter);

    // Set incoming texture format to:
    // GL_BGR       for CV_CAP_OPENNI_BGR_IMAGE,
    // GL_LUMINANCE for CV_CAP_OPENNI_DISPARITY_MAP,
    // Work out other mappings as required ( there's a list in comments in main() )
    GLenum inputColourFormat = GL_BGR_EXT;
    if (mat.channels() == 1)
    {
        inputColourFormat = GL_LUMINANCE;
    }

    // Create the texture
    glTexImage2D(GL_TEXTURE_2D,     // Type of texture
        0,                 // Pyramid level (for mip-mapping) - 0 is the top level
        GL_RGB,            // Internal colour format to convert to
        mat.cols,          // Image width  i.e. 640 for Kinect in standard mode
        mat.rows,          // Image height i.e. 480 for Kinect in standard mode
        0,                 // Border width in pixels (can either be 1 or 0)
        inputColourFormat, // Input image format (i.e. GL_RGB, GL_RGBA, GL_BGR etc.)
        GL_UNSIGNED_BYTE,  // Image data type
        mat.ptr());        // The actual image data itself

    // If we're using mipmaps then generate them. Note: This requires OpenGL 3.0 or higher
    if (minFilter == GL_LINEAR_MIPMAP_LINEAR ||
        minFilter == GL_LINEAR_MIPMAP_NEAREST ||
        minFilter == GL_NEAREST_MIPMAP_LINEAR ||
        minFilter == GL_NEAREST_MIPMAP_NEAREST)
    {
        glGenerateMipmap(GL_TEXTURE_2D);
    }

    return textureID;
}

使用方法如下

cv::Mat mat1;
GLuint textureID;
textureID = matToTexture(mat1,GL_LINEAR,GL_LINEAR,GL_CLAMP);

其中mat.ptr()返回的是指向矩阵的指针,也可以用mat.data代替,只要了解了如何把该Mat类型的矩阵值调用出来就可以用简单的glTextureImage2D实现了,一个更简单的代码如下

glGenTextures(1, &textureID);
glBindTexture(GL_TEXTURE_2D, textureID);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mat1.cols, mat1.rows, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, mat1.ptr()); // GL_BGR_EXT
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

这里有一点要注意的是,为什么使用enum: GL_BGR_EXT,其实Mat类中的三通道的排列是BGR的顺序而不是普通的RGB排序,至于为什么,这跟计算机内存中存数据的顺序BIG-endian和little-endian有关,还有人说是几个大牛互相不服气制定不同的规则,总之就是如下的排列方式:

BYTE B_channel = mat1.ptr<cv::Vec3b>(i,j)[0];
BYTE G_channel = mat1.ptr<cv::Vec3b>(i,j)[1];
BYTE R_channel = mat1.ptr<cv::Vec3b>(i,j)[2];

起初我将GL_BGR_EXT写成了GL_RGB,得到了整体颜色偏紫色的效果图,就是因为R和B-channel调换了的效果。


一些微小的工作,希望能够帮助大家!^ ^

2017-07-16 20:57:33 twinkle_star1314 阅读数 2222
  • 3D图形理论

    课程实现一套软3D,即不依赖任何第三方API(OpenGL,D3D,GDI)等。 课程从建立建立颜色缓冲区,绘制点,绘制线,绘制面,绘制图片,建立纹理,作图形的旋转,图像的混合,建立三维坐标系,实现模型矩阵,投影矩阵,观察矩阵,深度缓冲区等三维核心功能,实现基本的OpenGL核心绘制功能,让开发者从底层,全面的认识3D,为优化,开发出更好的游戏奠定基础。

    19174 人正在学习 去看看 张立铜

图像中亮度明显而急剧变化的点通常称为边缘或边缘点

噪声:边缘检测中一个主要的问题就是图像噪声。这是因为边缘检测器是为了响应急剧变化而构造的;但是在图像中获得急剧变化的方法就是在像素上添加噪声(因为在每一个像素点上的噪声值通常是无关联的,或者说有可能相差很大)。噪声这个术语通常表示无法获取信息的图像度量或者与图像中所包含的无关信息的图像度量,其余的则都是信号。


纹理处理中的三个基本问题:

纹理分割:把图片分成不同的部分,每部分内部具有相近的纹理问题。纹理分割包括表示纹理、确定分割区域的边缘的基本原理。

纹理合成:寻找如何利用小的范例图像构造大片纹理区域的方法。我们用范例图像来建立纹理的概率模型,然后利用概率模型来获得纹理的图像。

纹理恢复形状:包括由图像纹理恢复表面的方向和表面的形状。通过假定在同一个表面的不同点的纹理看起来相同来完成这一点,这意味着不同点之间纹理的差异提供了表面形状的信息。


两个图像领域的相似度可以用相应的像素的平方差之和来衡量。

android opengles 纹理

阅读数 1025

没有更多推荐了,返回首页