0

I am trying to find a highest point of an object in a mask of bitwise. I researched and found this question i did exactly as the answer said but the results were just (0,0) which are wrong

My Mask Expected Result
enter image description here enter image description here
My Original Image
enter image description here

I am just trying in the same image as the question

Here is the code for that

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()



Output Of The Script

(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

4
  • Use np.where(has_white) to find the coordinates of white pixels, then np.argmin on the y's. Commented May 11, 2021 at 13:37
  • @QuangHoang can you explain it as a from of code Commented May 11, 2021 at 13:38
  • @QuangHoang my results are always zero why is it happening ? any idea ? it always shows 0 Commented May 11, 2021 at 13:39
  • Perhaps you have a white pixel at y=0 somewhere? Try applying a noise filter (gaussian or median) or cv2.morphologyEx opening/closing to your b/w image. Commented May 11, 2021 at 13:44

1 Answer 1

1

This line has_white = print(np.any(draw_img, axis=1)) doesn't make much sense because what you store in has_white is the result of print(), which is None. Try changing:

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

to:

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

Now you are taking np.any over multiple axes, and has_white will contain a value for each row that is True if the row contains white or False otherwise.

The next line uses np.argmax() rather than np.argmin(). This means it finds the maximum of your array (your array only contains True and False so the max will be True) and returns the first index of a row that contains that max value. Since the array contains True where you have white, this will be first row containing white.

Therefore it will print the row of your highest point in draw_img. Since you have applied a margin, draw_img is smaller than your input, so you will need to account for that.

Now that you have the row, you can find the column.

row_index = np.argmax(has_white)
column = draw_img[row_index]
column_has_white = np.any(column, axis=1)
column_index = np.argmax(column_has_white)

One end of your line is (row_index, column_index) and the other is (draw_img.shape[0], column_index).

Sign up to request clarification or add additional context in comments.

8 Comments

still have the error. And posted the output of np.any(draw_img, axis=1)and the final output of the co-ordinate's
thanks for you answer. i updated the code as your answer said but now it says numpy.AxisError: axis 2 is out of bounds for array of dimension 2 and when i changed the axis to just one it says (0,59).
I'm surprised, draw_img should have 3 dimensions. Can you change print(draw_img.shape[:2]) to print(draw_img.shape) so we can see the full array shape?
there was a mistake from my side becuase i unknowingly created 2d mask instead of a 3d but now it works.And the result is 59,0 | how can i draw line with this co-ordinate because to draw line you need two co-ordinate
I've added how to find the two ends of the line. By the way, my code should only have printed the row 59, not 59,0 so the zero is coming from something else.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.