Расстояние между ребрами

#python #opencv #distance

#python #opencv #расстояние

Вопрос:

Я хочу получить расстояние (нарисованное красным) из этого рисунка. Таким образом, это просто прямая линия от внешних обнаруженных ребер. Я новичок во всей обработке изображений в OpenCV, и я не смог найти правильное решение в Интернете, поэтому я спрашиваю здесь. Я надеюсь, что кто-нибудь сможет мне помочь.

введите описание изображения здесь

введите описание изображения здесь

Комментарии:

1. Вам нужно найти все красные пиксели с координатами, затем вычесть первый и последний, остальное просто.

2. Действительно ли красная линия является частью изображения, или вы нарисовали ее, чтобы показать, что вы имеете в виду, но обычно ее там не будет? Если вы просто добавили это для объяснения, пожалуйста, предоставьте второе изображение без него, чтобы люди могли протестировать. Спасибо.

3. Да, красная линия предназначена только для обозначения того, о чем идет речь. Хорошо, да, я предоставлю это.

4. Второе изображение является исходным источником, где я хочу определить ширину сварного шва. И после некоторых шагов предварительной обработки я получил другое изображение, где красная линия должна показывать, какое расстояние я хочу измерить.

5. Теперь я вижу 2 изображения разного размера с явно несвязанным контентом?

Ответ №1:

Вот способ сделать то, что я предложил в комментариях. Сначала просуммируйте столбцы, чтобы получить изображение той же ширины, что и ваш оригинал, но только с одной строкой. Затем найдите первый и последний столбцы, сумма которых не равна нулю, то есть первый и последний столбцы, которые не являются полностью черными. Я обрезал ваше изображение — пожалуйста, не публикуйте снимки экрана, иначе алгоритмы найдут рамки окна!

введите описание изображения здесь

 import cv2
import numpy as np

# Load image as greyscale
im = cv2.imread('weld.png', cv2.IMREAD_GRAYSCALE)

# Sum down the columns
columnTotals = np.sum(im, axis=0)

# Now look for non-zero (non-black) entries
nz = np.nonzero(columnTotals)

# Now get left and right edges of white parts of image
left, right = nz[0][0], nz[0][-1]              # (53,271)
  

Вот наглядное представление того, что делает код при суммировании столбцов:

введите описание изображения здесь

columnTotals выглядит так:

 array([    0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,   510,
       18870, 19890, 19890, 20400, 19890, 19890, 19125,  3060,  6120,
        6630,  6375,  6630,  6375,  6120,  5610,  5100,  5100,  5355,
        5355,  7140,  7395,  7650,  7395,  7395,  7905,  7650,  4335,
        4335,  4590,  5610,  6375,  6120,  6885,  6630,  6120,  5610,
        6375,  5865,  6120,  5100,  5100,  5355,  5865,  5865,  6120,
        5865,  5355,  5100,  5355,  5100,  4845,  4590,  4590,  4590,
        4590,  4590,  4590,  4590,  4845,  5355,  5865,  5865,  6375,
        5610,  5100,  5100,  4590,  4335,  3570,  3060,  2805,  2805,
        2550,  2295,  2805,  3570,  3570,  4080,  4080,  4335,  3825,
        3570,  3570,  3570,  3570,  3570,  3570,  3570,  3570,  3570,
        3825,  3825,  3825,  3825,  3570,  3570,  3570,  3570,  3570,
        3570,  3570,  3570,  3570,  3570,  3570,  3570,  3570,  3570,
        3570,  3570,  3570,  3570,  3570,  3570,  3315,  3315,  3315,
        3315,  3570,  3315,  3315,  3570,  3570,  3570,  3570,  3570,
        3570,  3570,  3570,  3570,  3825,  3570,  3570,  3315,  2805,
        2805,  2805,  2805,  2805,  3060,  3060,  3060,  3060,  3060,
        3060,  3060,  3060,  2805,  2805,  2295,  2295,  2550,  2805,
        2805,  3060,  3060,  3060,  2805,  2805,  2295,  1785,  1785,
        1785,  1785,  1785,  2040,  2040,  2295,  2550,  2295,  2295,
        2040,  2040,  1785,  1785,  1785,  2040,  1785,  2040,  1785,
        1785,  2295,  2295,  2295,  2295,  2040,  1785,  1785,  1785,
        1785,  1785,  1785,  2295,  3060,  3570,  4335,  4335,  4590,
        4845,  5100,  5355,  3570,  3570,  3060,  3060,  2040,  1785,
        2040,  2040,  2295,  3315, 11220, 11730, 11730, 11475, 10965,
        9945,  8670,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0,     0,     0,
           0,     0,     0,     0,     0,     0,     0], dtype=uint64)
  

nz выглядит так:

 (array([ 53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,  65,
         66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,  78,
         79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,  91,
         92,  93,  94,  95,  96,  97,  98,  99, 100, 101, 102, 103, 104,
        105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117,
        118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130,
        131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143,
        144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156,
        157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
        170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182,
        183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195,
        196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208,
        209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
        222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234,
        235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247,
        248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
        261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271]),)
  

Комментарии:

1. Большое вам спасибо за вашу помощь! Это отлично подходит для моей проблемы. Таким образом, расстояние, которое вы получите, будет тогда 271-53 = 218. Таким образом, расстояние будет составлять 218 пикселей, верно?