边缘检测(一)-灰度图像边缘检测方法

      灰度图像边缘检测是数字图像处理与机器视觉中经常遇到的一个问题,边缘检测是否连续、光滑是判断检测方法优劣的一个重要标准,下面通过一个实例提供灰度图像边缘检测方法,该方法对其他图像检测也具有一定的参考价值。

     首先,读入一幅灰度图像,然后直接使用Canny算子对其进行边缘检测,发现其检测效果不好,故改变思路,先将灰度图像转换为二值图像,然后通过数学形态学平滑边缘后再进行边缘检测。算法主要步骤:读入灰度图像,使用最大类间方差法对图像二值化,然后反色,并填充二值图像孔洞。然后,选取合适结构元素分别使用数学形态学开运算和闭运算对图像进行平滑,最后使用bwmorph对平滑后二值图像进行边缘提取,取得了较好的边缘检测效果。最后对原始灰度图像eight.tif边缘检测的主要图像处理过程进行显示。

详细代码如下:

clear all;close all;clc;

I=imread('eight.tif');

E1=edge(I,'canny');%采用canny算子对灰度图像直接进行边缘检测

figure,imshow(E1);%检测效果不好

bw=im2bw(I,graythresh(I));%使用最大类间方差法进行图像二值化

figure,imshow(bw);

bw=imcomplement(bw);%图像反色

figure,imshow(bw);

bw2=imfill(bw,'holes');%对二值图像填孔洞

figure,imshow(bw2);

E2=bwmorph(bw2,'remove');

figure,imshow(E2);%边缘检测效果不理想--二值图像边界不平滑

Se=strel('disk',3);%对比使用不同类型和不同尺寸结构元素

bw3=imopen(bw2,Se);%图像开运算--对图像边界平滑

figure,imshow(bw3);

E3=bwmorph(bw3,'remove');

figure,imshow(E3);%边缘检测效果好

bw4=imclose(bw2,Se);%图像闭运算—对图像边界平滑

figure,imshow(bw4);

E4=bwmorph(bw4,'remove');

figure,imshow(E4);%边缘检测效果好

figure('Name','灰度图像边检检测','NumberTitle','off')

subplot(2,3,1),imshow(I),title('原始灰度图像');

subplot(2,3,3),imshow(bw2),title('二值图像');

subplot(2,3,2),imshow(E1),title('对灰度图像直接使用canny算子边缘检测');

subplot(2,3,4),imshow(E2),title('bwmorph边缘检测');

subplot(2,3,5),imshow(E3),title('bwmorph+imopen边缘检测');

subplot(2,3,6),imshow(E4),title('bwmorph+imclose边缘检测');

%本程序在MATLAB 2018b检测通过

最后运行结果如下图所示:

  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
灰度图像边缘检测图像处理中的一个重要应用,C语言可以通过数学形态学等方法实现灰度图像边缘检测。以下是一个基于数学形态学的C语言灰度图像边缘检测的例子: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define BMP_HEADER_SIZE 54 #define BMP_COLOR_TABLE_SIZE 1024 #define CUSTOM_IMG_SIZE 512*512 unsigned char header[BMP_HEADER_SIZE]; unsigned char colorTable[BMP_COLOR_TABLE_SIZE]; unsigned char buf[CUSTOM_IMG_SIZE]; int main() { FILE* fp = fopen("lena_gray.bmp", "rb"); if (fp == NULL) { printf("Error: cannot open the file!\n"); return 0; } // 读取BMP文件头和颜色表 fread(header, sizeof(unsigned char), BMP_HEADER_SIZE, fp); fread(colorTable, sizeof(unsigned char), BMP_COLOR_TABLE_SIZE, fp); // 读取图像数据 fread(buf, sizeof(unsigned char), CUSTOM_IMG_SIZE, fp); // 关闭文件 fclose(fp); // 灰度图像边缘检测 int i, j, k, sum; int threshold = 100; // 阈值 unsigned char new_buf[CUSTOM_IMG_SIZE]; memset(new_buf, 0, CUSTOM_IMG_SIZE); for (i = 1; i < 511; i++) { for (j = 1; j < 511; j++) { sum = 0; for (k = -1; k <= 1; k++) { sum += buf[(i-1)*512+j+k] + buf[i*512+j+k] + buf[(i+1)*512+j+k]; } sum /= 9; if (abs(buf[i*512+j] - sum) > threshold) { new_buf[i*512+j] = 255; } } } // 将边缘图像保存为新的BMP文件 fp = fopen("lena_gray_edge.bmp", "wb"); if (fp == NULL) { printf("Error: cannot create the file!\n"); return 0; } // 写入BMP文件头和颜色表 fwrite(header, sizeof(unsigned char), BMP_HEADER_SIZE, fp); fwrite(colorTable, sizeof(unsigned char), BMP_COLOR_TABLE_SIZE, fp); // 写入图像数据 fwrite(new_buf, sizeof(unsigned char), CUSTOM_IMG_SIZE, fp); // 关闭文件 fclose(fp); return 0; } ``` 该例子中,我们首先读取了一个灰度图像lena_gray.bmp,然后使用数学形态学方法进行边缘检测,最后将边缘图像保存为新的BMP文件lena_gray_edge.bmp。在边缘检测的过程中,我们使用了一个3x3的模板,对每个像素点进行处理,如果该像素点与周围像素点的灰度值差异大于阈值,则将该像素点标记为边缘点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值