Java教程

【裂痕识别】基于matlab阈值裂痕+划痕检测【含Matlab源码 467期】

本文主要是介绍【裂痕识别】基于matlab阈值裂痕+划痕检测【含Matlab源码 467期】,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、简介

1 阈值
我们将图像分块最简单的方法就是设定一个阈值对图像进行二值化处理,那么这个阈值我们应该如何选择呢
在这里插入图片描述
对于图像的直方图存在明显边界的图像,我们可以很容易找到这个阈值,但是如果图像直方图分界不明显,那么这个阈值的寻找将变得十分困难。因此我们存在全局阈值与局部阈值两种。
在这里插入图片描述
2 全局阈值
全局阈值就是在整幅图像中我们只有一个阈值来对图像进行二值化,但是其存在其局限性,例如图像中存在高斯噪声的情况下,我们无法找到一个很好的阈值将图像的边界分开
在这里插入图片描述
另外如果图像的边界是在局部对比下出现的,即不同位置阈值不同,那么全局阈值的效果也非常不好。
在这里插入图片描述
我们先不管全局阈值的缺点,我们来看看我们如何通过计算来获得这个全局阈值T呢?我们又OTSU'S算法。
在这里插入图片描述
下面是一些数学概念在图像上的体现
在这里插入图片描述
OTSU算法就是想把图像分为两个块,然后使得这两个块之间的方差最大,也就是最大化两个块的均值与全局均值的差的平方
在这里插入图片描述
在这里插入图片描述
由于只存在这么一个阈值,那么我们在计算的时候可以简单地让这个值遍历0-255,然后找到σB最大的值,这个值就是我们要的阈值。我们可以理解为这个值把图像分为了相距最远的两块。我们在matlab中有graythresh这个函数来实现这个过程。
在这里插入图片描述
下图就显示了一个OTSU算法不是很理想的例子。
在这里插入图片描述
为了克服以上缺点我们有两点解决方法:1.先通过低通滤波器去噪再用OTSU 2.只在考虑边缘部分的像素来计算阈值,这样可以大大减少其他不重要部分对阈值计算过程的影响
在这里插入图片描述
3 局部阈值
下面让我们来看看局部阈值/自适应阈值。它的原理就是将图像分块,对于不同的部分应用不同的阈值,在matlab中我们有blockproc这个函数来实现这个过程
在这里插入图片描述
我们看到相比于之前,效果确实有很大的提升,但是缺点也特别明显,就是图像会出现分块化
在这里插入图片描述
我们可以调小块的大小,但是这样的话会出现如果块内像素值变化不大的话,块内像素被全部分作黑或白而缺失了边界(例如右上角窗户的上方黑色的窗框内有白色的像素块)。因此块的选择是十分重要的。
在这里插入图片描述
更好的方式是我们在每个像素周围的一个区域内来计算阈值,根据这个块内的均值方差来计算这个像素的值是1还是0
在这里插入图片描述
在这里插入图片描述
4 RGB图阈值
除了将阈值在灰度图上应用,我们还可以将其应用在RGB图中,我们可以设定一种颜色,来得到与这种颜色相近颜色的物体
在这里插入图片描述
例如我们取下图丝带的颜色可以得到如右图的结果
在这里插入图片描述

二、源代码

close all; clear; clc;
warning off all;
%% 第一类划痕1-1.jpg 1-2.jpg
I = imread('1-1.jpg');
IGrey = rgb2gray(I);
%IGrey = adapthisteq(IGrey);  % Contrast-limited adaptive histogram equalization (CLAHE)
Ibw = im2bw(IGrey);% Ibw是二值图像,不需要求阈值
Ibw = ~Ibw;
Ibw = bwareaopen(Ibw,20)        ;%将小于XX像素的单元去掉
figure,
subplot(1,2,1) 
imshow(I);
title('原图');
subplot(1,2,2)
imshow(Ibw);
title('划痕检测图');

I = imread('1-2.jpg');
IGrey = rgb2gray(I);
level = graythresh(IGrey)
Ibw = im2bw(IGrey,level);% Ibw是二值图像,不需要求阈值
Ibw = ~Ibw;
figure,
subplot(1,2,1) 
imshow(I);
title('原图');
subplot(1,2,2)
imshow(Ibw);
title('划痕检测图');
%% 第二类划痕2-1.jpg 2-2.jpg
I = imread('2-1.jpg');
IGrey = rgb2gray(I);
w2 = fspecial('average',[15 15]);    %% 先定义一个滤波器
IMean = imfilter(IGrey,w2,'replicate');       %%让图像通过滤波器
result = abs(imsubtract(im2double(IGrey),im2double(IMean)));
maxValue = max(max(result));
threshod = maxValue * 0.3;
result(result >= threshod) = 1;
result(result < threshod) = 0;
Ibw = bwareaopen(im2uint8(result),10);%将小于XX像素的单元去掉
figure,
subplot(1,2,1) 
imshow(I);
title('原图');
subplot(1,2,2)
imshow(Ibw);
title('划痕检测图');

I = imread('2-2.jpg');
IGrey = rgb2gray(I);
w2 = fspecial('average',[15 15]);    %% 先定义一个滤波器
IMean = imfilter(IGrey,w2,'replicate');       %%让图像通过滤波器
result = abs(imsubtract(im2double(IGrey),im2double(IMean)));
maxValue = max(max(result));

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、备注

版本:2014a

完整代码或代写加1564658423

这篇关于【裂痕识别】基于matlab阈值裂痕+划痕检测【含Matlab源码 467期】的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!