精华内容
下载资源
问答
  • 自己编写的基于matlab的Sobel、Prewitt和Roberts的源程序,输入灰度图,可以直接显示对应算子的对应图像
  • Prewitt和Sobel算子

    千次阅读 2019-05-31 16:46:24
    我如下定义水平、垂直两对角线方向的梯度: 该定义下的算子称之为Prewitt算子: Sobel算子是在Prewitt算子的基础上改进的,在中心系数上使用一个权值2,相比较Prewitt算子,Sobel模板能够较好的抑制(平滑)...

    在3*3模板中:

    我如下定义水平、垂直和两对角线方向的梯度:  

    该定义下的算子称之为Prewitt算子: 

    Sobel算子是在Prewitt算子的基础上改进的,在中心系数上使用一个权值2,相比较Prewitt算子,Sobel模板能够较好的抑制(平滑)噪声。 
    计算公式为: 


    Sobel算子:

           上述所有算子都是通过求一阶导数来计算梯度的,用于线的检测,在图像处理中,通常用于边缘检测。在图像处理过程中,除了检测线,有时候也需要检测特殊点,这就需要用二阶导数进行检测。

    Mat src = imread("test.png", IMREAD_GRAYSCALE);
    imshow("src", src);
    
    //X方向—Prewitt算子
    Mat imgx;
    Mat kernel_x = (Mat_<int>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1);
    filter2D(src, imgx, -1, kernel_x, Point(-1, -1), 0, 0);
    imshow("x方向", imgx);
    
    Mat imgy;
    //Y方向—Prewitt算子
    Mat kernel_y = (Mat_<int>(3, 3) << -1, 0, 1, -1, 0, 1, -1, 0, 1);
    filter2D(src, imgy, -1, kernel_y, Point(-1, -1), 0, 0);
    imshow("y方向", imgy);
    
    waitKey();

    参考:

    https://blog.csdn.net/swj110119/article/details/51777422

    展开全文
  • prewitt和sobel算子 边缘检测

    千次阅读 2014-11-07 22:04:18
    #include "cv.h" #include "highgui.h" #include #pragma comment(lib, "cv.lib") #pragma comment(lib, "cxcore.lib") #pragma comment(lib, "highgui.lib")  ...void prewitt(IplImage *src,IplIm
    #include "cv.h"
    
    #include "highgui.h"
    #include <math.h>


    #pragma comment(lib, "cv.lib")  
    #pragma comment(lib, "cxcore.lib")  
    #pragma comment(lib, "highgui.lib") 


    void prewitt(IplImage *src,IplImage *dst)  
    {  
    int i,j;
    IplImage *dstx,*dsty;
    int temp;  
     float tempx,tempy;
     uchar* ptrx,* ptry;
     double min_val = 0, max_val = 0;

     //定义prewitt算子的模板  

    //sobel算子

    /*

     float sobel[9] =           
     {  
      -1,-2,-1,  
      0,0,0,  
     1,2,1  
     };  
     float sobel[9] =   
     {  
      -1,0,1,  
      -2,0,2,  
      -1,0,1  
     };  

    */


     float prewittx[9] =           
     {  
      -1,-1,-1,  
      0,0,0,  
     1,1,1  
     };  
     float prewitty[9] =   
     {  
      -1,0,1,  
      -1,0,1,  
      -1,0,1  
     };  
     CvMat px; 
     CvMat py;     
     px = cvMat(3,3,CV_32F,prewittx);     
     
     py = cvMat(3,3,CV_32F,prewitty); //为输出图像申请空间  
     dstx = cvCreateImage(cvGetSize(src),8,1);   
     dsty = cvCreateImage(cvGetSize(src),8,1); //对图像使用模板,自动填充边界  
     cvFilter2D(src,dstx,&px,cvPoint(-1,-1));   
     cvFilter2D(src,dsty,&py,cvPoint(-1,-1)); //计算梯度,范数为2,注意学习指针的使用方法  
      
     ptrx = (uchar*) dstx->imageData;  
     ptry = (uchar*) dsty->imageData;  
     for(i = 0;i<src->height;i++)  
     {  
      for(j = 0;j<src->width;j++)  
      {  
       tempx = ptrx[i*dstx->widthStep+j];  
       tempy = ptry[i*dsty->widthStep+j];   
       temp = (int) sqrt(tempx*tempx+tempy*tempy);  
     if (temp>125)
    temp=255;
    else temp=0;  
       dst->imageData[i*dstx->widthStep+j] = temp;  
      }  
     }   
     //取图并显示像中的最大最小像素值  
     cvMinMaxLoc(dst,&min_val,&max_val,NULL,NULL,NULL);     
    // printf("max_val = %f\nmin_val = %f\n",max_val,min_val);  
       
     //计算梯度,范数为1  
     //cvAdd(dstx,dsty,dst);  
     cvSaveImage("PrewittImg.jpg", dst);//把图像存入文件  
     cvReleaseImage(&dstx);  
     cvReleaseImage(&dsty);  
     cvNamedWindow("prewitt",1);  
     cvShowImage("prewitt",dst); 
     cvWaitKey(0);
    }  
    void main()
    {
    IplImage *src,*dst;
    src=cvLoadImage("1.jpg",0);
    dst=cvCreateImage(cvGetSize(src),IPL_DEPTH_8U,1);
    cvNamedWindow("src",1);
    cvShowImage("src",src);
    //cvSmooth(src,src,CV_GAUSSIAN,3,3,0,0);
    cvSmooth(src,src,CV_MEDIAN,3,3,0,0);
    cvThreshold(src,src,95,255,CV_THRESH_BINARY);

    //cvSobel(src,dst,1,1,3);

    //cvErode(src,src,NULL,1);
    //cvDilate(src,src,NULL,1);
    prewitt(src,dst);

    }

    展开全文
  • 边缘检测 ...边缘是图像中的重要的结构性特征,边缘往往存在于目标背景之间,因此它可以作为图像分割的重要依据。 在边缘检测中,它提取的是图像中不连续部分的特征,将闭合的边缘提取出来便可以作

    参考:https://blog.csdn.net/chaolei3/article/details/79809703

    边缘检测

    边缘检测的任务就是找到具有阶跃变化或者屋顶变化的像素点的集合
    边缘其实就是图像上灰度级变化很快的点的集合
    检测图像中的一些像素点,它们周围的像素点的灰度发生了急剧的变化。可以用来标注图像中不同物体的边界
    边缘是图像中的重要的结构性特征边缘往往存在于目标和背景之间,因此它可以作为图像分割的重要依据
    在边缘检测中,它提取的是图像中不连续部分的特征,将闭合的边缘提取出来便可以作为一个区域
    区域划分相比,边缘检测不需要逐个的对像素进行比较,比较适合大图像的处理.
    图像以矩阵的形式存储的,对一幅图像的求导相当于对一个平面、曲面求导。而获取一幅图像的梯度就转化为:模板(Roberts、Prewitt、Sobel、Lapacian算子)对原图像进行卷积。

    边缘检测通过取得图像像素值的变化,求导得到

    拉普拉斯提取边缘属于使用二阶导提取边缘,而sobel,prewitt,Roberts,差分法都是属于一阶导数求边缘。
    (1)一阶导数通常会产生较粗的边缘。
    (2)二阶导数对精细细节,如细线、孤立点和噪声有较强的响应。
    (3)二阶导数在灰度斜坡和灰度台阶过渡处会产生双边沿响应。
    (4)二阶导数的符号可以确定边缘的过渡是从亮到暗还是从暗到亮。
    (5)二阶导数对细节更敏感。
    一般的,提取边缘之前最好先做下图像平滑处理,因为导数对噪声比较敏感
    在使用拉普拉斯算子提取边缘之前,先使用高斯平滑图像,这一过程就是Laplacian-Gauss(LOG)算子

    Roberts算子

    利用两个二维矩阵的卷积核,一个斜对角为1,-1;另一个斜对角都是0;对图像进行卷积操作,得到像素值之间的一阶梯度变化。如下图
    在这里插入图片描述

    Prewitt算子

    和Roberts算子更大的不同和是变成3*3的卷积核,以及增加了垂直和水平方向上的一阶梯度
    在这里插入图片描述

    Sobel算子

    Sobel算子在Prewitt算子的基础上增加了权重的概念,认为相邻点的距离远近对当前像素点的影响是不同的,如下图中的中心的绝对值较大
    在这里插入图片描述

    Canny算子

    参考:https://zhuanlan.zhihu.com/p/42122107,https://blog.csdn.net/weixin_40647819/article/details/91411424
    相比Sobel、Prewitt等算子,Canny算法更为优异。Sobel、Prewitt等算子有如下缺点:
    1.没有充分利用边缘的梯度方向。
    2.最后得到的二值图,只是简单地利用单阈值进行处理,结果会受阈值影响较大
    Canny算法基于这两点做了改进,提出了:
    1,基于边缘梯度方向的非极大值抑制。non_max_supression
    2,双阈值的滞后阈值处理。,如下图所示

    在这里插入图片描述
    canny步骤:
    1、高斯滤波:简单的说就是一个高斯矩阵乘以每一个像素点及其邻域,取其带权重的平均值作为最后的灰度值。
    2、计算梯度幅度和方向梯度方向一般离散为一下几种:
    量化化情况可总结为:
    水
    3,对像素进行非极大值抑制:在每一点上,领域中心 x 与沿着其对应的梯度方向的两个像素相比,若中心像素为最大值,则保留,否则中心置0,这样可以抑制非极大值,保留局部梯度最大的点,以得到细化的边缘。
    4,双阈值的设置设置两个阀值(threshold),分别为maxVal和minVal。其中大于maxVal的都被检测为边缘,而低于minval的都被检测为非边缘。对于中间的像素点,如果与确定为边缘的像素点邻接,则判定为边缘;否则为非边缘

    展开全文
  • #include #include #include using namespace cv; int main() { Mat grad_x, grad_y; Mat abs_grad_x, abs_grad_y, dst, src_gray, abs_dst; Mat src = imread("6013202130.jpg"); //工程目录下应该有
    #include <opencv2/opencv.hpp>
    #include<opencv2/highgui/highgui.hpp>
    #include<opencv2/imgproc/imgproc.hpp>
    using namespace cv;
    int main()
    {
        Mat grad_x, grad_y;
        Mat abs_grad_x, abs_grad_y, dst, src_gray, abs_dst;
        Mat src = imread("6013202130.jpg");  //工程目录下应该有一张名为1.jpg的素材图
        imshow("【原始图】sobel边缘检测", src);
        Sobel(src, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT);
        convertScaleAbs(grad_x, abs_grad_x);
        Sobel(src, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT);
        convertScaleAbs(grad_y, abs_grad_y);
        addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst);
        imshow("【效果图】整体方向Sobel", dst);
        GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT);
        cvtColor(src, src_gray, CV_RGB2GRAY);
        Laplacian(src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT);
        convertScaleAbs(dst, abs_dst);
        imshow("【效果图】图像Laplace变换", abs_dst);
        waitKey(0);
        return 0;
    }

    展开全文
  • #include <opencv2/opencv.hpp> #include<opencv2/highgui/highgui.hpp> #include<opencv2/imgproc/imgproc.hpp> using namespace cv; int main() { Mat grad_x, grad_y;... Mat ab...
  • Prewitt是一种常用的检测图像边缘的滤波器,它分为横向纵向算子,分别用于检测纵向横向的边缘(注意:横向形式的滤波器检测图像的纵向边缘,纵向形式的滤波器检测图像的横向边缘)。 横向Prewitt滤波器...
  • 边缘检测被认为是图像处理中非常重要的基础工具... 根据使用这三种技术获得的比较结果,可以清楚地发现Prewitt和Homogeneity算法的性能优于Sobel算法。 因此,可以推荐Prewitt和均质算法作为边缘检测中的有用检测工具。
  • 学习DIP第47天 转载请标明本文出处:http://blog.csdn.net/tonyshengtan ,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:... ... ...依然是废话,这篇主要想对比下Sobel,Prewitt和Scharr...
  • Prewitt分割实现

    2018-12-25 17:34:21
    基于matlab,灰度化图像后,用Prewitt算子进行图像分割。
  • java 边缘检测 sobel算子和Prewitt算子

    千次阅读 2014-07-27 17:15:16
    Prewitt算子
  • Prewitt算子

    2015-05-06 09:27:34
    经典的图像边缘检测算子,值得参考。很有借鉴意义。matlab函数形式
  • Prewitt详解

    2020-08-05 11:00:29
    水平 Mat src = (Mat_<float>(5, 5) << 1, 2, 3, 4, 5, 2, 3, 6, 5, 7, 25, 35, 45, 35, 55, 7, 8, 9, 10, 11, ...//X方向—Prewitt算子 Mat imgx; Mat k...
  • Prewitt算子程序

    2013-08-16 11:30:18
    Prewitt算子程序,边缘检测,简单,实用,比较有用!
  • Sobel Prewitt

    2020-12-06 14:10:54
    锐化通用函数 function test() %m文件的名字必须与第一个主函数的名字一致,不然无法运行 M=imread('test.jpg'); SobelMatrix1=[-1 0 1;-1 0 1;-1 0 1];%X轴方向 SobelMatrix2=[-1 -1 -1;... Dist(:,:,i)=Sharpening(M...
  • opencv prewitt边缘检测

    2018-08-07 10:58:46
    opencv3.3 prewitt算子边缘检测c++代码实现,具有很好的检测效果
  • prewitt算子

    千次阅读 2018-06-23 13:38:40
    #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv; int main( int, char** argv ) { Mat src,gray,Kernelx,Kernely;...
  • Prewitt边缘算子

    千次阅读 2015-12-12 21:28:14
    由两个卷积核形成Prewitt边缘检测算子, 分别用卷积核对图像卷积,比较图像点,取其最大值。
  • prewitt算子实现

    2021-06-13 14:07:32
    void prewitt(Mat& src, Mat& dst) { //获取Prewitt算子 Mat getPrewitt_horizontal = (Mat_<float>(3, 3) << -1, -1, -1, 0, 0, 0, 1, 1, 1); //水平方向 Mat getPrewitt_vertical = (Mat_...
  • 基于Prewitt算子旋转投影提出一种新的纸币图像倾斜校正法.该方法采用水平边缘检测、垂直边缘检测以及旋转投影求取纸币图像的水平倾斜角度垂直倾斜角度,然后对水平倾斜的纸币图像进行双线性插值旋转校正,对...
  • prewitt算子高通滤波

    2010-06-14 20:53:05
    prewitt算子高通滤波 windows平台 MFC编写
  • Prewitt 边缘检测

    千次阅读 2016-11-18 21:18:58
    #include #include #include "opencv2/imgproc/imgproc.hpp" ...// prewitt算子实现 cv::Mat prewitts(cv::Mat img, bool verFlag = false) { img.convertTo(img, CV_32FC1); cv::Mat prewitt_kernel = (cv
  • prewitt算子边缘检测

    2018-07-26 14:26:34
    简单的prewitt算子边缘检测,文档内含两幅试验图片(效果不太好,可以换图)
  • 边缘检测中Prewitt的maltab程序
  • 自编matlab下的边缘检测算法,以prewitt算子示例
  • j] = np.sqrt(np.square(new_imageX[i,j]) + np.square(new_imageY[i, j])) return new_imageX,new_imageY,new_image # 无方向算子处理的图像 def prewitt(img): W, H = img.shape new_image = np.zeros((W-3, H-3)...
  • 本文分别采用Laplacian算子、Robert算子、Prewitt算子Sobel算子进行图像锐化边缘处理实验。本文主要讲解灰度线性变换,基础性知识希望对您有所帮助。 1.Roberts算子 2.Prewitt算子 3.Sobel算子 4.Laplacian算子 5....
  • 目录 1 边缘检测的基本原理 2 边缘检测算子分类 ...5 Prewitt 算子 5.1 基本原理 5.2 代码示例 6 Sobel 算子 6.1 基本原理 6.2 代码示例 7 Laplacian 算子 7.1 基本原理 7.2 代码示例 8 小结 8...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,464
精华内容 1,785
关键字:

prewitt和