Hello Mat

 找回密码
 立即注册
查看: 3573|回复: 0

Prewitt算子

[复制链接]

1297

主题

1523

帖子

112

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2017-2-5 11:34:05 | 显示全部楼层 |阅读模式
      Prewitt算子将边缘检测算子模板的大小从2×2扩大到3×3,进行差分算子的计算,将方向差分运算与局部平均相结合,从而减小噪声对图像边缘检测的影响。
      Prewitt算子对图像中每个像素点都用这两个模板进行卷积,取最大值作为输出,最终产生边缘图像。Prewitt算法对图像边缘检测效果较粗,背景噪声对算法有效性影响较大,阈值选取不适当会造成边缘点误判等缺陷。
Prewitt算子边缘检测程序如下:
  1. %% Prewitt
  2. clc,clear,close all                    % 清屏、清工作区、关闭窗口
  3. warning off                         % 消除警告
  4. feature jit off                        % 加速代码执行
  5. I=imread('1.jpg');   % 读入图像
  6. r=I(:,:,1);g=I(:,:,2);b=I(:,:,3);
  7. nI=size(r);
  8. im = single(I) / 255;

  9.         yfilter = fspecial('prewitt');  % prewitt
  10.         xfilter = yfilter';            % 转置
  11.        
  12.         rx = imfilter(im(:,:,1), xfilter);   % x滤波模板
  13.         gx = imfilter(im(:,:,2), xfilter);   % x滤波模板
  14.         bx = imfilter(im(:,:,3), xfilter);   % x滤波模板
  15.        
  16.         ry = imfilter(im(:,:,1), yfilter);    % y滤波模板
  17.         gy = imfilter(im(:,:,2), yfilter);   % y滤波模板
  18.         by = imfilter(im(:,:,3), yfilter);   % y滤波模板
  19.        
  20.         Jx = rx.^2 + gx.^2 + bx.^2;
  21.         Jy = ry.^2 + gy.^2 + by.^2;
  22.         Jxy = rx.*ry + gx.*gy + bx.*by;
  23.        
  24.         D = sqrt(abs(Jx.^2 - 2*Jx.*Jy + Jy.^2 + 4*Jxy.^2));                 % 2x2 matrix J'*J的第一个特征值
  25.         e1 = (Jx + Jy + D) / 2;
  26.         %  e2 = (Jx + Jy - D) / 2;                 %第二个特征值

  27. edge_magnitude = sqrt(e1);
  28. edge_orientation = atan2(-Jxy, e1 - Jy);
  29. % figure,
  30. % subplot(121),imshow(edge_magnitude)   % 幅值
  31. % subplot(122),imshow(edge_orientation)   % 方向

  32. pre=edge(edge_magnitude,'prewitt',0.19);
  33. % figure,imshow(y),title('Prewitt Edge Detection')

  34. % 3*3 prewitt
  35. f=edge_magnitude;
  36. sx=[-1 0 1;-1 0 1;-1 0 1]; % convolution mask卷积掩膜
  37. sy=[1 1 1;0 0 0;-1 -1 -1]; % convolution mask卷积掩膜
  38. for x=2:1:nI(1,1)-1
  39.     for y=2:1:nI(1,2)-1
  40.         mod=[f(x-1,y-1),f(x-1,y),f(x-1,y+1);   % 模板
  41.             f(x,y-1),f(x,y),f(x,y+1);
  42.             f(x+1,y-1),f(x+1,y),f(x+1,y+1)];
  43.         mod=double(mod);    % 转换类型
  44.         fsx=sx.*mod;         % 边缘检测
  45.         fsy=sy.*mod;         % 边缘检测
  46.         ftemp(x,y)=sqrt((sum(fsx(:)))^2+(sum(fsy(:)))^2);
  47.     end
  48. end
  49. fs=im2bw(ftemp); % fs=im2uint8(ftemp);
  50. fs=bwareaopen(fs,1000);
  51. % figure,imshow(fs);title('Prewitt Edge Detection');

  52. subplot(131),imshow(edge_magnitude),title('edge magnitude')  % 幅值
  53. subplot(132),imshow(pre),title('edge magnitude extraction')     % 边缘提取
  54. subplot(133),imshow(fs);title('Prewitt Edge Detection');         % Prewitt锐化滤波
复制代码







算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-5-14 04:01 , Processed in 0.217457 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表