2017-02-19 3 views
0

Мне нужно извлечь область из изображения (не могу раскрыть это изображение). С помощью этого Abid K Rahman's answer Я получил изображение как Result Image Я получил точки, которые могут сделать прямоугольник, но не смогли найти прямоугольник, который является наилучшим приблизительным.Поиск приблизительного прямоугольника из набора точек

[[625, 389], [10, 385], [116, 184], [5, 35], [626, 26]] 

Можно предположить, что все четыре точки прямоугольника будут находиться в четырех разных углах изображения. Поэтому я разделил набор на четыре разные группы на основе их местоположения.

[[[[41, 63]], [[613, 66]]], [[[227, 428], [25, 426], [39, 392]], [[612, 394]]]] 

Но я не могу двигаться дальше. Я хочу извлечь точки, которые примерно образуют прямоугольник. Лучше, если ответ находится на питоне.

+0

Это все, что вы нам дадите? Вы можете узнать [Как задать хороший вопрос] (http://stackoverflow.com/help/how-to-ask) и создать [Минимальный, Полный и Подтверждаемый] (http://stackoverflow.com/help/ mcve). Это облегчает нам помощь. –

+0

@StephenRauch У меня есть ограничения. Хотя я немного обновил. –

+0

Любая проблема оптимизации требует ограничений. Вы ничего не указали. Предложите попытаться выяснить, что ваше приложение будет считать подходящим прямоугольником. –

ответ

0

Итак, я продолжал писать свой код, используя что-то rayryeng, и предложил это.

c = [[[] for x in range(2)] for y in range (2)] 
for xy in centroids: 
    x_i = xy[0]*2/col 
    y_i = xy[1]*2/row 
    c[y_i][x_i].append(np.array(xy)) 

combination = [] 
combination = np.array([ np.array([q1,q2,q3,q4]) for q1 in c[0][0] for q2 in c[0][1] for q3 in c[1][1] for q4 in c[1][0]]) 

if len(combination)>0 : 
    key = 0 
    property = [[ 0 for j in range(4)] for i in range(len(combination))] 
    for i in range(len(combination)): 
     q = combination[i] 
     d1,d2 = q[2]-q[0],q[1]-q[3] 
     d1_len,d2_len = np.sqrt(sum(d1**2)),np.sqrt(sum(d2**2)) 
     angle = math.degrees(math.acos(sum(d1*d2)/(d1_len*d2_len))) 
     if d1_len > d2_len: 
      r,extent = int(100*d1_len/d2_len),d2_len 
     else: 
      r,extent = int(100*d2_len/d1_len),d1_len 
     property[i] = [r,angle,extent,i] 
    property.sort(key = lambda x:x[0]) 
    key = property[0][3] 
    combination = combination[key] 

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

-1

лучше всего imcrop(I,rect); где определяют прямоугольник, как

прямоугольник = [Xmin ширина высота Ymin]

так на первую пару, например, [41,63], [613,66]

Xmin = 41

Ymin = 63

ширина = 613-41

height = 66-63

+1

Опять неправильный ответ.Внимательно прочитайте вопрос. Прямоугольник должен быть автоматически задан с учетом набора точек. – rayryeng

Смежные вопросы