Python 大津阈值内掩模
我正在使用Python,并尝试对图像进行大津阈值分割,但仅限于遮罩内部(是的,我有一个图像和一个遮罩图像)。这意味着在计算大津阈值时,直方图中将包含较少的图像像素 我目前正在使用没有遮罩图像的Python 大津阈值内掩模,python,numpy,opencv,image-processing,masking,Python,Numpy,Opencv,Image Processing,Masking,我正在使用Python,并尝试对图像进行大津阈值分割,但仅限于遮罩内部(是的,我有一个图像和一个遮罩图像)。这意味着在计算大津阈值时,直方图中将包含较少的图像像素 我目前正在使用没有遮罩图像的cv2.threshold功能,不知道如何做这种工作 ret,OtsuMat=cv2.threshold(GaborMat,0255,cv2.THRESH\u BINARY+cv2.THRESH\u OTSU) 由于这个函数还包含了遮罩外的像素,我认为它会给出一个不太准确的阈值 这是图像及其遮罩的示例:
cv2.threshold
功能,不知道如何做这种工作
ret,OtsuMat=cv2.threshold(GaborMat,0255,cv2.THRESH\u BINARY+cv2.THRESH\u OTSU)
由于这个函数还包含了遮罩外的像素,我认为它会给出一个不太准确的阈值
这是图像及其遮罩的示例:
希望有一个OpenCV或其他lib函数可以轻松实现(也可以使用快速计算),但任何形式的帮助都将不胜感激。我使用skimage中的
threshold\u otsu()
方法和Numpy掩码数组尝试了一下。我不知道是否有更快的方法-通常情况下,撇渣是非常优化的。如果其他任何人想要获取我的样本数据并尝试其他想法,请随意-尽管服务费为一票;-)
这就给了我们:
测试数据的直方图如下所示,x轴为0..255
根据您自己的样本数据,我得出以下结论:
#!/usr/bin/env python3
import cv2
import numpy as np
import numpy.ma as ma
from skimage.filters import threshold_otsu
# Load images
im = cv2.imread('eye.tif', cv2.IMREAD_UNCHANGED)
mask = cv2.imread('mask.tif', cv2.IMREAD_UNCHANGED)
# Calculate Otsu threshold on entire image
print(threshold_otsu(im)) # prints 130
# Now do same for masked image
masked = ma.masked_array(im,mask>0)
print(threshold_otsu(masked.compressed())). # prints 124
对于OpenCV,似乎没有内置的函数。就像建议的那样(C++而不是Python),您可以为这个循环使用OpenCV源代码设置自己的函数。记住,问题和答案是免费的,所以如果你被卡住了,回来再问一些。祝你的项目好运!
# Now make a mask revealing only left half of image, centred on 32 and 64
mask=np.zeros((100,400))
mask[:,200:]=1
masked = ma.masked_array(im,mask)
print(threshold_otsu(masked.compressed())) # Prints 47
# Now do same revealing only right half of image, centred on 160 and 192
masked = ma.masked_array(im,1-mask)
print(threshold_otsu(masked.compressed())) # Prints 175
#!/usr/bin/env python3
import cv2
import numpy as np
import numpy.ma as ma
from skimage.filters import threshold_otsu
# Load images
im = cv2.imread('eye.tif', cv2.IMREAD_UNCHANGED)
mask = cv2.imread('mask.tif', cv2.IMREAD_UNCHANGED)
# Calculate Otsu threshold on entire image
print(threshold_otsu(im)) # prints 130
# Now do same for masked image
masked = ma.masked_array(im,mask>0)
print(threshold_otsu(masked.compressed())). # prints 124