在Opencv Python中的BitWise掩码中查找最高点 [英] Finding Highest Point In A BitWise Mask In Opencv Python

查看:63
本文介绍了在Opencv Python中的BitWise掩码中查找最高点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个对象的按位掩码,我想从该对象中检测其最高点.如何使用OpenCV Python做到这一点?

I have a bitwise mask of a object from which I want to detect its highest point. How can I do this using OpenCV Python?

<身体>
我的面具预期结果

原始图片:

这是该代码

import cv2
import numpy as np

def line(im, pt1, pt2, color, thickness):
    im = cv2.line(im, pt1, pt2, color=color, thickness=thickness, lineType=cv2.LINE_AA)
    return im

def empty(a):
    pass

path = 'images/m_1.jpg'

global img
img = cv2.imread(path)
img = cv2.resize(img, (640, 480))
org_img = img.copy()
copy_img = img.copy()

img_blur = cv2.blur(img,(5,5))
imgHSV = cv2.cvtColor(img_blur, cv2.COLOR_BGR2HSV)

h_min = 0
h_max = 179
s_min = 0
s_max = 255
v_min = 48
v_max = 166

lower = np.array([h_min, s_min, v_min])
upper = np.array([h_max, s_max, v_max])

mask = cv2.inRange(imgHSV, lower, upper)

global imgResult
imgResult = cv2.bitwise_and(img, img, mask=mask)
imgResult = cv2.resize(imgResult, (640, 480))

cont, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

c = max(cont, key=cv2.contourArea)
x, y, w, h = cv2.boundingRect(c)
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

image = cv2.line(img, (int(w/2),y), (int(w/2),y+h), (0,0,255), 2)

global cropped_img
cropped_img = copy_img[y:y + h, x:x + w]

draw_img = np.zeros((img.shape[0], img.shape[1], img.shape[2]), dtype="uint8")
cv2.drawContours(draw_img,[c],-1,(255,255,255),thickness=-1)

img_bitwise = cv2.bitwise_and(org_img, draw_img)

margin = 90
draw_img = draw_img[margin:-margin]
imgResult = imgResult[margin:-margin]
img = img[margin:-margin]
img_bitwise = img_bitwise[margin:-margin]

print(draw_img.shape[:2])

has_white = print(np.any(draw_img, axis=1))
print(np.argmin(has_white))

result_i = np.argmin(has_white)
print(np.argmin(img_bitwise[result_i,:]))


cv2.imwrite('bit_img.png',img_bitwise)

cv2.imshow("Track Images", imgResult)
cv2.imshow("Result Images", img)
cv2.imshow("Cropped Image", cropped_img)
cv2.imshow("Draw Image", draw_img)
cv2.imshow("bit_img", img_bitwise)


k = cv2.waitKey(0)

if k == 27:  # wait for ESC key to exit
    cv2.destroyAllWindows()
elif k == ord('s'):  # wait for 's' key to save and exit
    cv2.imwrite(r'C:\Users\Anush\PycharmProjects\WeldPoolAnalysis\resultImages\imgResult.png', img)
    cv2.imwrite(r'C:\Users\Anush\PycharmProjects\WeldPoolAnalysis\resultImages\imgCropped.png', cropped_img)
    cv2.destroyAllWindows()



脚本输出

(300, 640)
[[False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [False False False]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [ True  True  True]
 [False False False]
 [False False False]
 [False False False]
 [False False False]]
0
0

在以下程序中将原始图像用作主图像,然后可以轻松调试问题

use the original image as the main image in the following program and then you can debug the problem easily

推荐答案

假设图片看起来像这样:

Let's say the image looks like this:

0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 1 0 0 0 0
0 0 0 1 1 1 0 0 0
0 1 1 1 1 1 1 0 0

1是白色,0是黑色.假设这个numpy数组称为 mask .让我们打印形状:

the 1 is white, the 0 is black. let's say this numpy array is called mask. Let's print the shape:

import numpy as np
print(mask.shape)

应该给你

(5,9) 

在这种情况下,您应该得到(image_width,image_height)

in this case, you should get (image_width, image_height)

然后,我们将首先检查是否有任何行是全黑的,或者是否有一些像素为白色的 np.any ,这样做是:'沿轴的每一行,是否有任何"字样?值不为0?如果是,则为该行返回True,否则为该行返回False".所以:

Then we'll first check if any rows are either fully black, or there is some pixel that is white with np.any, which does this: 'for every row along axis, is there "any" value which is not 0? if yes return True for that row, otherwise return False for that row'. So:

has_white = print(np.any(mask, axis=1))

收益

array([False, False, True, True, True])

因此每行的 True/False 值.

现在我们取最小值,因为它是图像中的最高行:

Now we take the smallest value, as it is the highest row in your image:

np.argmin(has_white)

收益

2

是从上到下的索引

这篇关于在Opencv Python中的BitWise掩码中查找最高点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆