我正在使用OpenCV-2.3 API在C++中编写一个小程序.我在使用非矩形掩模处理自适应阈值时遇到问题.
到目前为止,我正在对整个图像执行自适应阈值并在之后进行屏蔽.我意识到,在我的情况下,这是一个错误,因为屏蔽像素将用于计算我感兴趣的像素的阈值(虽然我只是想从分析中排除前者)...但是,不像像cv :: norm,cv :: adaptiveThreshold似乎不支持显式掩码.
你知道任何明显的解决方案或解决方法吗?昆汀,非常感谢你的建议
我写了一些Python(抱歉不是C++)代码,可以实现屏蔽自适应阈值。它不是很快,但它可以满足您的要求,并且您可以将其用作 C++ 代码的基础。其工作原理如下:
mean_conv
图像显示初始图像、掩模、最终处理图像。
这是代码:
import cv
import numpy
from scipy import signal
def thresh(a, b, max_value, C):
return max_value if a > b - C else 0
def mask(a,b):
return a if b > 100 else 0
def unmask(a,b,c):
return b if c > 100 else a
v_unmask = numpy.vectorize(unmask)
v_mask = numpy.vectorize(mask)
v_thresh = numpy.vectorize(thresh)
def block_size(size):
block = numpy.ones((size, size), dtype='d')
block[(size - 1 ) / 2, (size - 1 ) / 2] = 0
return block
def get_number_neighbours(mask,block):
'''returns number of unmasked neighbours of every element within block'''
mask = mask / 255.0
return signal.convolve2d(mask, block, mode='same', boundary='symm')
def masked_adaptive_threshold(image,mask,max_value,size,C):
'''thresholds only using the unmasked elements'''
block = block_size(size)
conv = signal.convolve2d(image, block, mode='same', boundary='symm')
mean_conv = conv / get_number_neighbours(mask,block)
return v_thresh(image, mean_conv, max_value,C)
image = cv.LoadImageM("image.png", cv.CV_LOAD_IMAGE_GRAYSCALE)
mask = cv.LoadImageM("mask.png", cv.CV_LOAD_IMAGE_GRAYSCALE)
#change the images to numpy arrays
original_image = numpy.asarray(image)
mask = numpy.asarray(mask)
# Masks the image, by removing all masked pixels.
# Elements for mask > 100, will be processed
image = v_mask(original_image, mask)
# convolution parameters, size and C are crucial. See discussion in link below.
image = masked_adaptive_threshold(image,mask,max_value=255,size=7,C=5)
# puts the original masked off region of the image back
image = v_unmask(original_image, image, mask)
#change to suitable type for opencv
image = image.astype(numpy.uint8)
#convert back to cvmat
image = cv.fromarray(image)
cv.ShowImage('image', image)
#cv.SaveImage('final.png',image)
cv.WaitKey(0)
Run Code Online (Sandbox Code Playgroud)
写完这篇文章后,我发现了这个很棒的链接,它有一个很好的解释和大量图像示例,我在上面的示例中使用了他们的文本图像。
笔记。Numpy 掩码似乎不受 scipy 的尊重signal.convolve2d(),因此上述解决方法是必要的。
| 归档时间: |
|
| 查看次数: |
4381 次 |
| 最近记录: |