精华内容
下载资源
问答
  • opencvSharp 遍历Mat像素点的两种方法

    千次阅读 2018-05-06 15:26:37
    在生成中勾选使用不安全的代码,方法和C++完全一样,详情见C++中遍历像素点。 public unsafe static Mat ConvolutionImage(Mat img, double[,] k, int offsetH, int offsetW, int height, int width) { Mat...

    一、在C#中用指针,在unsafe中运行。在生成中勾选使用不安全的代码,方法和C++完全一样,详情见C++中遍历像素点。

    public unsafe static Mat ConvolutionImage(Mat img, double[,] k, int offsetH, int offsetW, int height, int width)
            {
                Mat src = new Mat(img, new Rect(offsetW, offsetH, width, height));
                Mat dst = new Mat(src.Size(), MatType.CV_8UC1, new Scalar(0));
                int rows = src.Height, cols = src.Width;
                int v;
                for(int i = 1; i < rows -1; i++)
                {
                    IntPtr a = dst.Ptr(i);
                    byte* b = (byte*)a.ToPointer();
                    for (int j = 1; j < cols - 1; j++)
                    {
                        b[j] = 200;
    
                    }
                }
                //for(int i = 1; i < rows -1; i++)
                //{
                //    for(int j = 1; j < cols -1; j++)
                //    {
                //        v = (int)Math.Abs(k[0, 0] * src.Get<byte>(i - 1, j - 1) + k[0, 2] * src.Get<byte>(i - 1, j + 1) + k[0, 1] * src.Get<byte>(i - 1, j) + k[2, 1] * src.Get<byte>(i + 1, j));
                //        v =(int)(255 - 2 * v + 2 * k[1, 1] * src.Get<byte>(i, j));
                //        v = v > 0 ? v : 0;
                //        v = v < 255 ? v : 255;
                //        dst.Set(i, j, v);
                //    }
                //}
                return dst;
            }

    二、用C#中的get和set方法,速度较慢

    //for(int i = 1; i < rows -1; i++)
                //{
                //    for(int j = 1; j < cols -1; j++)
                //    {
                //        v = (int)Math.Abs(k[0, 0] * src.Get<byte>(i - 1, j - 1) + k[0, 2] * src.Get<byte>(i - 1, j + 1) + k[0, 1] * src.Get<byte>(i - 1, j) + k[2, 1] * src.Get<byte>(i + 1, j));
                //        v =(int)(255 - 2 * v + 2 * k[1, 1] * src.Get<byte>(i, j));
                //        v = v > 0 ? v : 0;
                //        v = v < 255 ? v : 255;
                //        dst.Set(i, j, v);
                //    }
                //}
    展开全文
  • 图像超像素(superpixels)分割算法——简单线性迭代聚类(SLIC) 原理  SILC(simple linear iterative clustering)是一种图像分割算法。默认情况下,该算法的唯一参数是k,约等于超像素尺寸的...

    图像超像素(superpixels)分割算法——简单线性迭代聚类(SLIC)

    原理

      SILC(simple linear iterative clustering)是一种图像分割算法。默认情况下,该算法的唯一参数是k,约等于超像素尺寸的期望数量。对于CIELAB彩色空间的图像,在相隔S像素上采样得到初始聚类中心。为了产生大致相同尺寸的超像素,格点的距离是$S=\sqrt{N/k}$。中心需要被移到3x3领域内的最低梯度处,这样做是为了避免超像素中心在边缘和噪声点上。

      接下来为每一个像素$i$设置最近的聚类中心,该聚类中心的搜索区域要覆盖该像素的位置。这是本算法加速的关键,因为通过限制搜索区域的大小减小了距离计算的数量,并且相对于传统的k-means聚类算法有显著的速度优势,因为后者的每个像素都必须和所有的聚类中心进行比较。一个超像素的预期空间范围是约为SxS的区域,这里对于相似像素的搜索是在超像素中心的2Sx2S区域完成。

      一旦每个像素被关联到最近的聚类中心后,就通过求聚类中心所有像素的均值来执行聚类中心的更新。使用$L_{2}$范数计算前一个聚类中心和当前聚类中心的残差。assignment和update步骤被重复迭代直到误差收敛,但是我们发现对于大多数图像10次迭代就够了。

    算法步骤

    1)通过在常规网格步长S处采样像素来初始化聚类中心

    2)在3x3的领域内移动聚类中心到最低的梯度位置

    3)为每一个像素$i$设置标签$l(i)$

    4)为每一个像素设置距离$d(i)=\infty$

    5)对于每一个聚类中心遍历2Sx2S区域内的每一个像素点,计算距离决定是否更新像素的标签和距离

    6)更新聚类中心

    7)重复步骤5)6)直到收敛

    posted @ 2018-06-21 17:24 mjl_cv 阅读( ...) 评论( ...) 编辑 收藏
    展开全文
  • 在opencv中有三种方式可以读写图像的像素,分别为:指针读写、迭代器读写、动态地址计算读写。虽然三种方式都可以完成同样的目的,但是运行速度却有快有慢,尤其是在实现一些复杂算法的时候,效率非常关键,下面就来...

    本文目的:

    在opencv中有三种方式可以读写图像的像素,分别为:指针读写、迭代器读写、动态地址计算读写。虽然三种方式都可以完成同样的目的,但是运行速度却有快有慢,尤其是在实现一些复杂算法的时候,效率非常关键,下面就来比较一下这三种方式的运行速度。

    实现代码:

    代码工程下载地址:http://download.csdn.net/detail/u013752202/9230389 

    下面代码实现的功能:分别使用三种方法实现图像像素的读写,并改变图像的亮度和对比度,然后对三种方法的运行速度进行比较。

    #include <QtCore/QCoreApplication>
    #include <opencv2/opencv.hpp>
    
    using namespace cv;
    /***********************************
    *通过.ptr指针访问像素
    ************************************/
    void lightAdjustPTR(Mat &image,int contrast,int bright)
    {
        for(int i=0;i<image.rows;i++){
            for(int j=0;j<image.cols;j++){
                for(int ch=0;ch<image.channels();ch++){
                    uchar curVal=image.ptr<Vec3b>(i)[j][ch];
                    image.ptr<Vec3b>(i)[j][ch]=saturate_cast<uchar>(0.01*contrast*curVal+bright);
                }
            }
        }
    }
    /***********************************
    *通过.at动态地址访问像素
    ************************************/
    void lightAdjustAT(Mat &image,int contrast,int bright)
    {
        for(int i=0;i<image.rows;i++){
            for(int j=0;j<image.cols;j++){
                for(int ch=0;ch<image.channels();ch++){
                    uchar curVal=image.at<Vec3b>(i,j)[ch];
                    image.at<Vec3b>(i,j)[ch]=saturate_cast<uchar>(0.01*contrast*curVal+bright);
                }
            }
        }
    }
    /***********************************
    *通过it迭代器访问像素
    ************************************/
    void lightAdjustIT(Mat &image,int contrast,int bright)
    {
        MatIterator_<Vec3b> it=image.begin<Vec3b>();
        MatIterator_<Vec3b> itend=image.end<Vec3b>();
        while(it!=itend){
            for(int ch=0;ch<image.channels();ch++){
                uchar curVal=(*it)[ch];
                (*it)[ch]=saturate_cast<uchar>(0.01*contrast*curVal+bright);
            }
            it++;
        }
    }
    
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        Mat srcPTR=imread("1.jpg");
        Mat srcAT=srcPTR.clone();
        Mat srcIT=srcPTR.clone();
        imshow("ShuiTan",srcPTR);
    
        //通过.ptr指针访问
        double timePTRS=static_cast<double>(getTickCount());//获取当前心跳数
        lightAdjustPTR(srcPTR,130,100);
        double timePTRT=((double)getTickCount()-timePTRS)/getTickFrequency();//求运行时间
        cout<<".ptr spent: "<<timePTRT<<"s"<<endl;//打印时间
    
        //通过.at动态地址访问
        double timeATS=static_cast<double>(getTickCount());//获取当前心跳数
        lightAdjustAT(srcAT,130,100);
        double timeATT=((double)getTickCount()-timeATS)/getTickFrequency();//求运行时间
        cout<<".at  spent: "<<timeATT<<"s"<<endl;//打印时间
    
        //通过it迭代器访问
        double timeITS=static_cast<double>(getTickCount());//获取当前心跳数
        lightAdjustIT(srcIT,130,100);
        double timeITT=((double)getTickCount()-timeITS)/getTickFrequency();//求运行时间
        cout<<"*it  spent: "<<timeITT<<"s"<<endl;//打印时间
    
        imshow("ShuiTanPTR",srcPTR);
        imshow("ShuiTanAT",srcAT);
        imshow("ShuiTanIT",srcIT);
        waitKey(0);
    
        return a.exec();
    }
    
    运行结果:

    从下面的运行结果可以看出,三种方法的运行速度从快到慢依次是:指针读写 < 迭代器读写 < 动态地址计算,指针读写的方式是最快的,所以在算法中尽量使用指针读写的方式来访问图像像素或矩阵元素。



    展开全文
  • 本文利用直线的对称性,采用等分迭代的思想对Bresenham直线生成算法进行改进,使得原算法一次只能生成一个点的Bresenham直线生成算法改进为一次能生成四行扫描线上的所有像素点。该算法思想简单,效率较高。如果直线...
  • SLIC 简单线性迭代聚类

    千次阅读 2019-06-13 22:58:15
    优点:SLIC在运行速度、生成超像素的紧凑度、轮廓保持方面都比较理想。...确定搜索范围2S*2S,为范围内每个像素点分配标签,期望的像素块大小S*S. 4.距离度量,空间距离和颜色距离 5.迭代优化,直至误差收...

    优点:SLIC在运行速度、生成超像素的紧凑度、轮廓保持方面都比较理想。

    步骤:1.初始化聚类中心

               2.以种子点为中心在3x3范围内选最小梯度点作为新的聚类中心.

               3.确定搜索范围2S*2S,为范围内每个像素点分配标签,期望的像素块大小S*S.

               4.距离度量,空间距离和颜色距离

               5.迭代优化,直至误差收敛,可理解为聚类中心不再变化

               6.增强连通性,消除单个像素或过小像素块

    详细见https://blog.csdn.net/electech6/article/details/45509779https://www.cnblogs.com/Imageshop/p/6193433.html

     

    展开全文
  • 代码放到自己的工程中,运行就可以的 #include &lt;opencv2\opencv.hpp&gt; #include &lt;opencv2\core\core.hpp&gt;...opencv2\highgui\highgui.hpp&...//用指针访问像素是最...
  • OpenCV - 均值迭代分割

    千次阅读 2016-12-03 23:12:24
    但是区域生长有一个最致命的就是需要选取一个生长的种子。 为了交流学习,同时也为了后面查阅方便,准备陆续将基于直方图的几种分割算法加以总结。 1、均值迭代算法的描述对一幅图像MM,均值迭代算法就是要迭代...
  • 一次迭代的第一步,对每个超像素的中心,2S范围内的所有像素点,判断他们是否属于这个超像素。这样之后,就缩短了像素点到超像素中心的距离。 一次迭代的第二步,对每个超像素,将它的超像素中心移动到这个超像素...
  • 1--如何遍历图像中的每一个像素点? 2--OpenCv的矩阵值是如何存储的? 3--如何测试我们所实现算法的性能? 4--查找表是什么?为什么要用它? (二)图像矩阵是如何存储在内存之中的? 1--图像矩阵的大小取决于我们...
  • opencv学习(四)之像素遍历三种方式

    万次阅读 多人点赞 2016-11-07 20:52:15
    这三种像素遍历方式在速度上有所不同,上一篇文章介绍过用C操作符[]是最快的访问方式。下面会通过对同一幅图像进行处理来直观的比较三种访问方式的速度差异。首先介绍一下opencv中提供的计时函数 1.计时
  • 最近邻插值 与 双线性插值算法 优化迭代 的 0.5 像素之差
  • 迭代法图像二值化

    万次阅读 2016-08-28 08:58:56
    图像二值化是指用灰度变换来研究灰度图像的一种常用方法,即设定某一阈值将灰度图像的像素分成大于阈值的像素群和小于阈值的像素群两部分。例如输人灰度图像函数为f (x,y),输出二值图像函数为g(x,y)则    ...
  • 在现实世界中,角...一提到角检测,最常用的方法莫过于Harris角检测,opencv中也提供了Harris角检测的接口,即cornerHarris(),但是Harris角检测存在很多缺陷(如角像素级别的,速度较慢等),open...
  • PET重建 MLEM迭代原理 讲解 以及C++成像代码 如有错误请在留言中指正 如有学习需要, 不懂得可以再留言
  • 前面用两篇介绍了像素的颜色空间缩减、查找表、遍历像素的三种方式、程序计时等,也说了一下每种方法的优缺点,现在用一个综合型的程序进行对比。方式是用三种方式对lena图像(220x220)进行处理,使其颜色种类从256...
  • 通过图像像素强度的梯度值来确定角的位置,是非常直观的角检测方法,下面我们将给出一个基于图像梯度(导数)方法的简介,在这类方法里用的比较多的便是Harris和KLT(Shi-Tomasi)方法了,我们将介绍其原理比较...
  • 概述 在现实世界中,角对应...一提到角检测,最常用的方法莫过于Harris角检测,opencv中也提供了Harris角检测的接口,即cornerHarris(),但是Harris角检测存在很多缺陷(如角像素级别的,速度较慢等)...
  • 大津法 大津法流程 大津法代码 ...% Dajin():利用迭代法寻求图像的阈值 % f 输入图像 % output 输出图像 % thread1 阈值 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sizeh = size(f,1);
  • 谈UE4高级渲染:动态光照迭代

    千次阅读 2017-03-15 16:54:34
    一旦美术调整一些东西重新back一次非常麻烦,所以如果是纯动态的光影效果,迭代速度会非常快,这也是一个很大的优势。 全动态的光照主要分为三个部分,一个是直接被太阳光照亮的表面,一个是被天光照亮的表面,还有...
  • 像素—学习笔记

    万次阅读 多人点赞 2019-06-28 15:04:46
    图像分割中的超像素是指具有相似纹理、颜色、亮度等特征的相邻相似构成的具有一定意义的不规则的像素块。...SLIC(simple linear iterative clustering),即简单的线性迭代聚类。它是2010年提出的一种思想简单...
  • 是图像中亮度变化最强地方反映了图像的本质特征,提取图像中的角可以有效提高图像处理速度与精准度。所以对于整张图像来说特别重要,角检测与提取的越准确图像处理与分析结果就越接近真实。同时.
  • 用户在使用贝壳找房产品时,经得用户同意后,APP 会采集当前用户 GPS 的位置信息,根据时段划分两类不同样本,比如上午的 10 到晚上 6 之间的位置是用户工作地,晚上的 8 到早上 8 的位置是用户居住地。...
  • 一旦美术调整一些东西重新back一次非常麻烦,所以如果是纯动态的光影效果,迭代速度会非常快,这也是一个很大的优势。 全动态的光照主要分为三个部分,一个是直接被太阳光照亮的表面,一个是被天光照亮的表面,还有...
  • 像素SLIC算法源码阅读

    千次阅读 2019-04-30 15:48:50
    像素SLIC算法源码阅读...SLIC的全称Simple Linear Iterative Clustering,即简单线性迭代聚类,论文和代码链接如下: 论文传送门:SLIC Superpixels Comparedto State-of-the-Art Superpixel Methods 代码传送门...
  • 一、图像像素的操作 访问图像像素值是图像处理的基本操作。OpenCV提供了很多访问方式,比较常用的三种方式:  (1) 通过指针访问  (2) 通过迭代器访问 ...(2)推荐用通过迭代器访问像素速度快,而且提取BG...
  • SLIC超像素算法

    万次阅读 多人点赞 2018-03-29 19:28:19
    原文出自:https://blog.csdn.net/Fighting_Dreamer/article/details/77170859SLIC与目前最优超像素算法的比较Radhakrishna Achanta, Appu Shaji, Kevin Smith, Aurelien Lucchi, Pascal Fua, and Sabine S¨...
  • SLIC超像素分割算法

    万次阅读 多人点赞 2017-09-22 18:17:13
    像素概念是2003年Xiaofeng Ren提出和发展起来的图像分割技术,是指具有相似纹理、颜色、亮度等特征的相邻像素构成的有一定视觉意义的不规则像素块。它利用像素之间特征的相似性将像素分组,用少量的超像素代替大量...
  • 区域生长和超像素

    千次阅读 2018-10-17 15:54:03
    区域生长的基本概念 数字图像分割算法一般是基于灰度值的两个基本特性之一:不连续性和相似性。...如下图所示,如下图所示的一个极端情况,只需确认一个种子节点,然后按8临域法搜索与其相同的,第一轮搜索结束后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,475
精华内容 7,390
关键字:

像素点迭代的速度