2015-02-02 3 views
0

У меня есть изображение, как показано ниже, и я хочу определить линию изображения, используя траншею PET пакета. Мне нужна помощь, чтобы понять, как получить линию от этого изображения.Hough transform R PET-пакет, обнаруживающий линию

library("PET", lib.loc="~/R/win-library/3.1") 
library("raster", lib.loc="~/R/win-library/3.1") 

p=matrix(diag(100), 100) 
library(raster) 
r <- raster(p) 
plot(r) 
abc=hough(p) 

viewData(list(p, abc$hData), list("Phantom", "Hough transformed phantom")) 

Я применил преобразование hough, как указано выше. Исходное изображение и изображение, которое я получаю после запуска последней строки, приведены ниже enter image description hereenter image description here

любые входные данные о том, как получить координаты линии (от исходного изображения)? Я понимаю, что белая точка со второй правой правой панели изображает линию. Эта линия построена с использованием системы Polar Cordinate. Но я не знаю, как использовать второе изображение, чтобы получить координаты исходной линии

Я посмотрел на документацию ПЭТ пакета, но было трудно понять :(Я побежал их пример кода, но я не понял, это

============================================================================================================ =============================

Я последовал за советы, данные в комментариях пользователя Ниццей и обновил свой код, как показано ниже

library("PET", lib.loc="~/R/win-library/3.1") 
library("raster", lib.loc="~/R/win-library/3.1") 

#p=matrix(diag(1000), 1000) 
p=matrix(rep(0,10000), 100, 100) 
# for (i in 1:100) 
# {p[i,100-i+1]=1 
# } 
for (i in 1:100) 
{p[i,50]=1 
} 


# library(raster) 
# r <- raster(p) 
# plot(r) 
abc=hough(p) 

maxPoint<-which(abc$hData==max(abc$hData),arr.ind=T) 
library(pracma) 
a<-cot(maxPoint[1,"row"]*pi/180) 
b<-maxPoint[1,"col"]/sin(maxPoint[1,"row"]*pi/180) 
a 
b 
par(pty="s") 
par(mfrow=c(1,2)) 
#image(r, main="org") 
image(p,main="original") 
image(abc$hData, main="Houghmatrix") 

Являются ли новые значения a и b правильными? Я чувствую, что b должно быть 50 (перпендикулярное расстояние исходной линии от (0,0)). Что я делаю не так?

Я также хотел бы знать, почему abc $ hData имеет 181 строку и 143 столбца. Я могу представить, что 181 ряд имеет какое-то отношение к PI радианам - 180 градусов. Но у меня нет никаких подсказок о 143 столбцах ...

============================================================================= ==================================== 0 0 что я получаю странные ответы. Я получаю a = -57.6 и b = 1786.12.

p=matrix(rep(0,10000), 100, 100) 

for (i in 1:100) 
{p[80,i]=1 
} 
+0

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

+0

Я заглянул в документацию пакета PET и посмотрел на страницу 4/hough part. В нем говорится, что входной параметр oData (matrix) - это матрица, содержащая изображение (для преобразования Hough). – user2543622

ответ

1

После того, как у вас есть преобразование Хафа данных, найти показатели максимальной матрицы (если у вас есть только одна строка):

maxPoint<-which(abc$hData==max(abc$hData),arr.ind=T)

Вы также можете взять среднее из всех maxPoitns, если вы знаете, что существует только одна строка. В вашем случае, вы получите это:

row col 
[1,] 137 72 

Вы нужны параметры по умолчанию функции, а

< houghParam -unlist (а $ Header)

Они дают вам RhoMin, ThethaMin, и DeltaMin и DeltaRho - приращения обеих переменных. С их помощью вы можете получить rho и theta из координат матрицы.

theta=(maxPoint[1,"row"]-1)*houghParam["DeltaXY1"]+houghParam["XYmin1"] 
rho=(maxPoint[1,"col"]-1)*houghParam["DeltaXY2"]+houghParam["XYmin2"] 

Если уравнение линии y=ax+b, вы можете получить a и b с помощью:

library(pracma) 
a<--cot(theta) 
b<-(rho)/sin(theta) 

Кроме того, в мужчине странице hough они утверждают, что они берут центр изображения как (0,0) баллов.

Для математического объяснения смотрите на Wikipedia page of Hough Transform ...

Edit: изменил формулу и удалить некоторые неправильные данные

Общий код будет:

library(PET) 
library(pracma) 

a=matrix(rep(0,10000), 100, 100) 
for (i in 1:100) 
{a[i,60]=1 
} 

d=matrix(rep(0,10000), 100, 100) 
for (i in 1:100) 
{d[60,i]=1 
} 

e=matrix(diag(100), 100) 

getLineHough<-function(p){ 
abc=hough(p) 
#get the brightest point in the hough tranform 
maxPoint<-which(abc$hData==max(abc$hData),arr.ind=T) 
#if there is only one line, can average the results in case there are several brightest points 
maxPoint<-apply(maxPoint,2,mean) 

houghParam<-unlist(abc$Header) 

theta=(maxPoint[1]-1)*houghParam["DeltaXY1"]+houghParam["XYmin1"] 
rho=(maxPoint[2]-1)*houghParam["DeltaXY2"]+houghParam["XYmin2"] 

a<--cot(theta) 
b<-rho/sin(theta) 


par(mfrow=c(1,2)) 
image(p,main="original") 
#add the predicted lines, also have to change the slope and intercept because 
#the origin of the plot function is not the center of the image the bottom left corner 
if(theta==0){ 
     abline(v=(rho+50)/100) 
} else{ 
     abline((b+50-a*50)/100,a) 
} 
image(abc$hData, main="Houghmatrix") 
} 

getLineHough(a) 
getLineHough(d) 
getLineHough(e) 

Edit2: документация на самом деле не говорит, что такое значение первой строки матрицы. Поскольку существует 181 строка, она должна начинаться с 0, а не 1 * houghParam ["DeltaXY1"]. Измененный код соответственно

EDIT3: сделал код в функцию и добавил расчетную линию на участке

+0

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

+0

Я чувствую, что что-то все еще отсутствует. Пожалуйста, ответьте на мой update2 – user2543622

+0

, изменив код, индекс должен начинаться с 0, а не 1, для вертикальной линии вы не можете получить уравнение, подобное y = ax + b, но параметры rho и theta верны – NicE

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