我有一个numpy array binary(黑白)图像和坐标列表中的元组,如:
coordlist =[(110, 110), (110, 111), (110, 112), (110, 113), (110, 114), (110, 115), (110, 116), (110, 117), (110, 118), (110, 119), (110, 120), (100, 110), (101, 111), (102, 112), (103, 113), (104, 114), (105, 115), (106, 116), (107, 117), (108, 118), (109, 119), (110, 120)]
或作为:
coordx = [110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110]
coordy = [110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120]
如何使用该坐标列表检查图像中是否存在“白色”像素? 我还想检查距离该坐标列表大约3个像素范围的白色像素。
即:
for i, j in coordx, coordy:
for k in a range (k-3, k + 3)
for l in a range (l-3, l + 3)
#checking white pixels also for pixel near coordinates list
我想到了“哪里”的功能。
from skimage import morphology
import numpy as np
path = 'image/a.jpg'
col = mh.imread(path)
bn0 = col[:,:,0]
bn = (bn0 < 127)
bnsk = morphology.skeletonize(bn)
bnskInt = np.array(bnsk, dtype=np.uint8)
#finding if there are white pixel in the coord list and around that in a 5 pixel range
for i in coordlist:
np.where(?)
更新
我尝试使用shape(128,128)而不是(128,128,3),因为我的图像有这样的形状:(a,b)但是现在它找不到白色像素! 为什么以这种方式找到了什么?
white_pixel = np.array([255, 255])
img = np.random.randint(0, 256, (128, 128))
print(img[150])
print(img.shape)
img[110, 110] = 255
img[109, 110] = 255
mask = np.zeros((128, 128), dtype=bool)
mask[coordx, coordy] = 1
#structure = np.ones((3, 3, 1))
#mask = scipy.ndimage.morphology.binary_dilation(mask, structure)
is_white = np.all((img * mask) == white_pixel, axis=-1)
# This will tell you which pixels are white
print np.where(is_white)
# This will tell you if any pixels are white
print np.any(is_white)
输出:
(array([], dtype=int32),)
False
答案 0 :(得分:4)
更新,我已经更新了使用二进制或灰度图像的答案。请注意,图像强度现在只是标量而不是(R,G,B)值,所有图像,蒙版和结构元素都是2d阵列而不是3d阵列。您可能需要调整white_pixel
的值(或以其他方式修改此代码以满足您的需要)。
import numpy as np
from skimage.morphology import binary_dilation
# Setup
coordx = [110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110]
coordy = [110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120]
img = np.random.random((128, 128))
img[110, 110] = 1.
img[109, 110] = 1.
# values grater than white_pixel will get detected as white pixels
white_pixel = 1
mask = np.zeros((128, 128), dtype=bool)
mask[coordx, coordy] = 1
structure = np.ones((7, 7))
mask = binary_dilation(mask, structure)
is_white = (img * mask) >= white_pixel
# This will tell you which pixels are white
print np.where(is_white)
# This will tell you if any pixels are white
print np.any(is_white)
原始答案:
如果你想知道哪些像素为白色,你只需要使用numpy.where
。我只是将图像乘以掩码并使用np.any
,如下所示:
# Setup
coordx = [110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 100, 101, 102,
103, 104, 105, 106, 107, 108, 109, 110]
coordy = [110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 110, 111, 112,
113, 114, 115, 116, 117, 118, 119, 120]
white_pixel = np.array([255, 255, 255])
img = np.random.randint(0, 256, (128, 128, 3))
img[110, 110, :] = 255
img[109, 110, :] = 255
mask = np.zeros((128, 128, 1), dtype=bool)
mask[coordx, coordy] = 1
structure = np.ones((7, 7, 1))
mask = binary_dilation(mask, structure)
is_white = np.all((img * mask) == white_pixel, axis=-1)
# This will tell you which pixels are white
print np.where(is_white)
# This will tell you if any pixels are white
print np.any(is_white)