Détection de segments dans une image#
C’est une technique assez vieille et qui consiste à détecter des segments comme des anomalies : l’alignement de points est un événement assez rare dans un nuage de points mais rare comment ? Cette idée mène à la probabilisation d’une image pour quantifier ce qu’est un alignement de points nécessairement rare.
Une image aléatoire#
On considère un bruit aléatoire uniforme dans une image et on ajoute des points aléatoires tirés le long d’une ligne selon une loi gaussienne : uniforme sur la ligne, gaussien autour du segment.
[17]:
from mlstatpy.image.detection_segment import random_noise_image, convert_array2PIL
img = random_noise_image((100, 100))
convert_array2PIL(img, mode="binary")
[17]:
[18]:
from mlstatpy.image.detection_segment import random_segment_image
random_segment_image(img, density=3.0, lmin=0.3)
[18]:
{'size': 43,
'angle': 0.45754951975081887,
'x1': 8,
'y1': 43,
'x2': 46.576920763478554,
'y2': 61.995293743669706,
'nbpoints': 129}
[19]:
convert_array2PIL(img, mode="binary")
[19]:
[20]:
random_segment_image(img, density=5.0, lmin=0.3)
random_segment_image(img, density=5.0, lmin=0.3)
convert_array2PIL(img, mode="binary")
[20]:
[21]:
pilimg = convert_array2PIL(img, mode="binary").convert("RGB")
pilimg
[21]:
[22]:
from PIL import ImageFilter
pilimg = (
pilimg.filter(ImageFilter.BLUR)
.filter(ImageFilter.BLUR)
.filter(ImageFilter.BLUR)
.filter(ImageFilter.BLUR)
)
pilimg
[22]:
[23]:
from PIL import ImageEnhance
enh = ImageEnhance.Sharpness(pilimg)
final_img = enh.enhance(4)
final_img
[23]:
Gradient#
La détection des segments est basée sur le gradient.
[24]:
from mlstatpy.image.detection_segment import compute_gradient, plot_gradient
grad = compute_gradient(final_img, color=0)
[25]:
plot_gradient(pilimg.copy(), grad, direction=-2)
[25]:
Détection de segments#
[26]:
from mlstatpy.image.detection_segment import detect_segments
seg = detect_segments(final_img, verbose=1, seuil_nfa=1e-1)
len(seg)
n = 1000 ... 81 temps 0.21 sec nalign 277
n = 2000 ... 152 temps 0.34 sec nalign 640
n = 3000 ... 180 temps 0.49 sec nalign 917
n = 4000 ... 290 temps 0.62 sec nalign 1312
n = 5000 ... 315 temps 0.81 sec nalign 1535
n = 6000 ... 330 temps 0.98 sec nalign 1859
n = 7000 ... 426 temps 1.14 sec nalign 2093
n = 8000 ... 457 temps 1.29 sec nalign 2425
n = 9000 ... 604 temps 1.53 sec nalign 2756
[26]:
605
[27]:
from mlstatpy.image.detection_segment import plot_segments
plot_segments(final_img.copy(), seg)
[27]:
Détection de segments sur une image#
[28]:
from PIL import Image
egl = Image.open("eglise_zoom2.jpg")
egl
[28]:
On réduit la taille de l’image.
[29]:
egl2 = egl.crop((0, 0, egl.size[0] // 3, 3 * egl.size[1] // 4))
egl2
[29]:
[30]:
grad2 = compute_gradient(egl2, color=0)
plot_gradient(egl2.copy(), grad2, direction=-2)
[30]:
[31]:
seg2 = detect_segments(egl2)
len(seg2)
[31]:
490
[32]:
from mlstatpy.image.detection_segment import plot_segments
res = plot_segments(egl2.copy(), seg2)
res
[32]:
Il faudrait fusionner les segments mais cela a l’air de marcher.