我正在尝试使用Opencv中的Otsu方法对图像进行阈值处理:
尽管当我设定阈值时,图片的某些部分完全被白色包围,并在Opencv中创建并最终没有检测到图像中的所有轮廓。这是我使用$numbers = [1, 2, 3, 4, ... 10000000];
$inverted = array_fill(0, count($numbers), 0);
foreach ($numbers as $i => $num) { $inverted[$i] = 1 / $num; }
执行大津的方法阈值时得到的:
编辑: 有人要求我使用的代码,因此这里是:
ret,thresh=cv2.threshold(blurred,0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)
答案 0 :(得分:2)
您无需手动找到最佳位置!让OpenCV为您做到!
OpenCV完全有一个自适应阈值算法,该问题来自于此类问题,称为adaptiveThreshold
此功能将图像分为多个子图像,并分别阈值。这意味着它将为图像的每个部分找到一个不错的阈值,并为您提供一个美观且均匀照明的图像。参见此example。
尝试一下:
th3 = cv.adaptiveThreshold(blurred,255,cv.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv.THRESH_BINARY,11,2)
更新: 像这样的功能并不是开箱即用的。如果它仍然会产生类似盐和胡椒味的伪影,则可以尝试:
blockSize
。这样可以确保每个块的内部都有一个字母,这将希望可以更好地选择阈值。 (例如,将图像分成25
个块而不是100
。blocksize
个像素11
个很小。)blurry
,我想您已经完成了此操作。adaptiveThreshold
。我希望这会有所帮助!
答案 1 :(得分:0)
尝试使用全局阈值方法代替Otsu的方法。
thresh_value = 50
ret,thresh= cv2.threshold(blurred,thresh_value,255,cv2.THRESH_BINARY)
更改thresh_value
参数,直到获得所需的结果。
要进一步了解阈值技术,请参阅documentation。