同一个阿里云可以做两个网站吗,南通注册公司,凡科快图在线制作免费,wordpress中文教程Otsu 处理 Otsu 处理是一种用于图像分割的方法#xff0c;旨在自动找到一个阈值#xff0c;将图像分成两个类别#xff1a;前景和背景。这种方法最初由日本学者大津展之#xff08;Nobuyuki Otsu#xff09;在 1979 年提出 在 Otsu 处理中#xff0c;我们通过最小化类别内…Otsu 处理 Otsu 处理是一种用于图像分割的方法旨在自动找到一个阈值将图像分成两个类别前景和背景。这种方法最初由日本学者大津展之Nobuyuki Otsu在 1979 年提出 在 Otsu 处理中我们通过最小化类别内方差或最大化类别间方差的方式来确定最佳阈值。具体步骤如下
首先计算图像的直方图即统计图像中每个像素值的频数。对于每个可能的阈值 T将图像分成两个类别小于等于 T 的像素为一个类别大于 T 的像素为另一个类别。对于每个阈值 T计算两个类别的像素值的均值和方差。使用类别内方差和类别间方差之间的比率称为 Otsu 函数来评估当前阈值的效果。Otsu 函数计算公式为(类别间方差) / (类别内方差)。找到使得 Otsu 函数最大化的阈值 T这个阈值就是最佳阈值。使用最佳阈值 T 将图像进行分割得到前景和背景。 Otsu 处理在图像分割中广泛应用特别是在二值化图像中可以有效地将图像分成前景和背景两部分并且对于具有明显双峰直方图的图像效果较好。 Otsu 处理与自适应阈值得区别 Otsu 处理和自适应阈值是两种不同的图像阈值处理方法它们在选择阈值的方式和应用场景上有所区别。 Otsu 处理
Otsu 处理是一种全局阈值处理方法它旨在找到一个适合整个图像的最佳阈值将图像分成前景和背景两部分。这个最佳阈值是通过最大化类间方差或最小化类内方差来确定的以使得前景和背景的差异最大化。 Otsu 处理适用于具有明显双峰直方图的图像即图像中存在明显的前景和背景像素值的分界点。 Otsu 处理是一个全局方法只使用图像的整体信息来确定阈值因此不适用于具有局部不均匀光照或噪声的图像。
自适应阈值
自适应阈值是一种局部阈值处理方法它根据图像中的局部区域来确定每个像素的阈值。这样可以在图像中的不同区域应用不同的阈值从而更好地处理具有局部不均匀光照或噪声的图像。 自适应阈值的计算过程是基于图像中每个像素周围的局部邻域进行的可以通过选择不同的算法例如平均值、高斯加权平均值等来计算局部阈值。 自适应阈值适用于具有非均匀光照或有噪声的图像可以提高阈值处理的准确性和效果。 综上所述Otsu 处理是一种全局阈值处理方法适用于具有明显双峰直方图的图像而自适应阈值是一种局部阈值处理方法适用于具有非均匀光照或噪声的图像。在实际应用中我们根据图像的特点选择合适的阈值处理方法以获得最佳的图像分割结果。 代码示例:
在使用函数 cv2.threshold()进行阈值处理时需要自定义一个阈值并以此阈值作为图像阈值处理的依据。通常情况下处理的图像都是色彩均衡的这时直接将阈值设为 127 是比较合适的。
但是有时图像灰度级的分布是不均衡的如果此时还将阈值设置为 127那么阈值处理的结果就是失败的。例如有一个图像 img里面的像素值为
[[123 123 123 123 123]
[123 123 123 123 123]
[123 123 126 126 126]
[123 123 126 126 126]
[123 123 126 126 126]]
此时如果仍然以 127 作为阈值那么阈值处理结果是
[[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]
[0 0 0 0 0]]很显然这不是我们想要的结果。我们可以观察到对于 img如果以阈值 125 进行分割可以得到较好的结果
[[ 0 0 0 0 0]
[ 0 0 0 0 0]
[ 0 0 255 255 255]
[ 0 0 255 255 255]
[ 0 0 255 255 255]]但是实际处理的图像往往是很复杂的不太可能像上述 img 那样一眼就观察出最合适的阈值。
如果一个个去尝试工作量无疑是巨大的。
Otsu 方法能够根据当前图像给出最佳的类间分割阈值。简而言之Otsu 方法会遍历所有可能阈值从而找到最佳的阈值。
在 OpenCV 中通过在函数 cv2.threshold()中对参数 type 的类型多传递一个参数,“cv2.THRESH_OTSU”即可实现 Otsu 方式的阈值分割。
需要说明的是在使用 Otsu 方法时要把阈值设为 0。此时的函数 cv2.threshold()会自动寻找最优阈值并将该阈值返回。
例如下面的语句让函数 cv2.threshold()采用 Otsu 方法进行 阈值分割 t,otsucv2.threshold(img,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU) 与普通阈值分割的不同之处在于
参数 type 增加了一个参数值“cv2.THRESH_OTSU”。 设定的阈值为 0。 返回值 t 是 Otsu 方法计算得到并使用的最优阈值。 需要注意如果采用普通的阈值分割返回的阈值就是设定的阈值。
例如下面的语句设定 阈值为 127所以最终返回的就是 t127。 t,thdcv2.threshold(img,127,255,cv2.THRESH_BINARY) 测试 Otsu 阈值处理的实现。
import cv2
import numpy as np
img np.zeros((5,5),dtypenp.uint8)
img[0:6,0:6]123
img[2:6,2:6]126
print(img\n,img)
#普通设定阈值
t1,thdcv2.threshold(img,127,255,cv2.THRESH_BINARY)
print(thd\n,thd)
print(设定得阈值 t1\n,t1)
#otsu设定阈值
t2,otsucv2.threshold(img,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU)
print(otsu 自动获取得阈值 t2\n,t2)
print(otsu\n,otsu)运行结果如下:
img[[123 123 123 123 123][123 123 123 123 123][123 123 126 126 126][123 123 126 126 126][123 123 126 126 126]]
thd[[0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0]]
设定得阈值 t1127.0
otsu 自动获取得阈值 t2123.0
otsu[[ 0 0 0 0 0][ 0 0 0 0 0][ 0 0 255 255 255][ 0 0 255 255 255][ 0 0 255 255 255]]总结果中我们可以找到上面自动阈值取到了123.找到了最佳得阈值.
对于像素数组得这个最佳阈值体没有感观得效果,我们接下来找个图片来看看 otsu 阈值处理得效果 代码如下:
import cv2
imgcv2.imread(tiffany.bmp,0)
t1,thdcv2.threshold(img,127,255,cv2.THRESH_BINARY)
t2,otsucv2.threshold(img,0,255,cv2.THRESH_BINARYcv2.THRESH_OTSU)
cv2.imshow(img,img)
cv2.imshow(thd,thd)
cv2.imshow(otus,otsu)
cv2.waitKey()
cv2.destroyAllWindows()运行结果如下,从效果中来看结果还是很明显得.otsu 得效果明显比自定义得阈值处理效果要好很多.