我是python图像处理的新手,不胜感激有关2个问题的一些建议。
并按如下所示打开它:
import cv2
import matplotlib.pyplot as plt
mask = cv2.imread('img_mask.jpg')
img = cv2.imread('img.jpg')
1)我有以下(x,y)像素位置:
pt1 = 43.35, 22.49
pt2 = 49.035, 46.985
pt3 = 18.326, 21.822
在蒙版上,pt1
和pt2
的像素值为0
,在pt3
的像素值为16
。给定三个(x,y)像素位置作为列表以及所提供的蒙版。如何有效地过滤遮罩上值为0
的位置?
2)如何有效地创建一个新的thresholded masked image
,然后将其覆盖在原始图像上,使得thresholded mask image
是一幅图像,其中蒙版的像素值仅为16原始蒙版中值为16的位置。
答案 0 :(得分:0)
对于第一部分,我不知道为什么你的点不是整数。我在问题中下载了遮罩,此代码可用于打印像素值= 0的线对。我读了灰度格式的蒙版。
img = cv2.imread('mask.jpg',0)
for i in range(0,img.shape[0]):
for j in range(0,img.shape[1]):
if img[i,j] == 0:
print(i,j)
对于第二部分,可以使用常规阈值。有关thresholding的更多信息,请参考opencv文档。我将图像放大了4倍,以获得更好的视图。然后,创建两个阈值分别为16和17的阈值,并对它们进行按位异或运算以获得结果。
zoom = cv2.resize(img, None, fx = 4, fy = 4, interpolation = cv2.INTER_CUBIC)
ret,thresh1 = cv2.threshold(zoom, 16, 255, cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(zoom, 17, 255, cv2.THRESH_BINARY)
output = cv2.bitwise_xor(thresh1, thresh2)
cv2.imshow('threshold with 16', thresh1)
cv2.imshow('threshold with more than 16', thresh2)
cv2.imshow('result', output)
cv2.waitKey(0)
cv2.destroyAllWindows()
阈值1
阈值2
输出