Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 大津阈值内掩模_Python_Numpy_Opencv_Image Processing_Masking - Fatal编程技术网

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) 由于这个函数还包含了遮罩外的像素,我认为它会给出一个不太准确的阈值 这是图像及其遮罩的示例:

我正在使用Python,并尝试对图像进行大津阈值分割,但仅限于遮罩内部(是的,我有一个图像和一个遮罩图像)。这意味着在计算大津阈值时,直方图中将包含较少的图像像素

我目前正在使用没有遮罩图像的
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