100 lines
2.2 KiB
Julia
100 lines
2.2 KiB
Julia
include("convolution.jl")
|
|
|
|
using Images
|
|
using TestImages
|
|
using FileIO
|
|
using Colors
|
|
using ImageFeatures
|
|
using Formatting
|
|
|
|
using .Convole
|
|
|
|
function hough(img, thetaRange=100, rhoRange=100)
|
|
r, c = size(img)
|
|
D = sqrt(r * r + c * c)
|
|
rho_min = -D
|
|
rho_max = D
|
|
L_rho = 2*D
|
|
rho_step = L_rho / rhoRange
|
|
|
|
theta_min = -pi/2
|
|
theta_max = pi/2
|
|
L_theta = pi
|
|
theta_step = L_theta / thetaRange
|
|
|
|
function dcm_rho(idx)
|
|
rho_min + ((idx) * rho_step) + (rho_step / 2)
|
|
end
|
|
function cdm_rho(rho)
|
|
round(Int32, (rho - rho_min) / rho_step)
|
|
end
|
|
function dcm_theta(idx)
|
|
theta_min + ((idx) * theta_step) + (theta_step / 2)
|
|
end
|
|
function cdm_theta(theta)
|
|
round(Int32, (theta - theta_min) / theta_step)
|
|
end
|
|
|
|
accumulator = zeros(Int32, rhoRange, thetaRange)
|
|
#= display(accumulator) =#
|
|
#= println() =#
|
|
for index in CartesianIndices(img)
|
|
x, y = Tuple(index)
|
|
for k in 1:thetaRange
|
|
theta = dcm_theta(k)
|
|
rho = x * cos(theta) + y * sin(theta)
|
|
i = cdm_rho(rho)
|
|
accumulator[i, k] += 1 # simple delta(x,y)
|
|
end
|
|
end
|
|
|
|
rho_idx, theta_idx = Tuple(argmax(accumulator))
|
|
rho, theta = dcm_rho(rho_idx), dcm_theta(theta_idx)
|
|
(rho, theta)
|
|
end
|
|
|
|
if abspath(PROGRAM_FILE) == @__FILE__
|
|
#= img = zeros(Bool,10,10) =#
|
|
#= for i in 1:10 =#
|
|
#= img[2,i] = img[i,2] = img[7,i] = img[i,9] = true =#
|
|
#= end =#
|
|
#= lines = hough_transform_standard(img) =#
|
|
#= =#
|
|
#= display(img) =#
|
|
#= println() =#
|
|
#= for line in lines =#
|
|
#= r, t = line =#
|
|
#= printfmt("x * cos({}π) + y * sin({}π) = {}\n", t/π, t/π, r) =#
|
|
#= end =#
|
|
|
|
gaussian_kernel = [
|
|
1 4 7 4 1
|
|
4 16 26 16 4
|
|
7 26 41 26 7
|
|
4 16 26 16 4
|
|
1 4 7 4 1
|
|
] ./ 273
|
|
laplacian_kernel = [
|
|
-1 -1 -1
|
|
-1 8 -1
|
|
-1 -1 -1
|
|
]
|
|
sobel_x_kernel = [
|
|
-1 0 1
|
|
-2 0 2
|
|
-1 0 1
|
|
]
|
|
sobel_y_kernel = rotl90(sobel_x_kernel)
|
|
|
|
img = load(ARGS[1])
|
|
img_gray = Gray.(img)
|
|
img_blur = conv(img_gray, gaussian_kernel)
|
|
img_edge_x = conv(img_blur, sobel_x_kernel)
|
|
img_edge_y = conv(img_blur, sobel_y_kernel)
|
|
img_edge = Gray.(round.(Int32, sqrt.((img_edge_x .^ 2) .* (img_edge_y .^ 2))))
|
|
save("hough_edge.jpg", img_edge)
|
|
r, t = hough(img_gray)
|
|
printfmt("x * cos({}π) + y * sin({}π) = {}\n", t/π, t/π, r)
|
|
end
|
|
|