Source code for arrayfire.vision

#######################################################
# Copyright (c) 2015, ArrayFire
# All rights reserved.
#
# This file is distributed under 3-clause BSD license.
# The complete license agreement can be obtained at:
# http://arrayfire.com/licenses/BSD-3-Clause
########################################################

"""
Computer vision functions (FAST, ORB, etc)
"""

from .library import *
from .array import *
from .features import *

[docs]def fast(image, threshold=20.0, arc_length=9, non_max=True, feature_ratio=0.05, edge=3): """ FAST feature detector. Parameters ---------- image : af.Array A 2D array representing an image. threshold : scalar. optional. default: 20.0. FAST threshold for which a pixel of the circle around a central pixel is consdered. arc_length : scalar. optional. default: 9 The minimum length of arc length to be considered. Max length should be 16. non_max : Boolean. optional. default: True A boolean flag specifying if non max suppression has to be performed. feature_ratio : scalar. optional. default: 0.05 (5%) Specifies the maximum ratio of features to pixels in the image. edge : scalar. optional. default: 3. Specifies the number of edge rows and columns to be ignored. Returns --------- features : af.Features() Contains the location and score. Orientation and size are not computed. """ out = Features() safe_call(backend.get().af_fast(ct.pointer(out.feat), image.arr, ct.c_float(threshold), ct.c_uint(arc_length), non_max, ct.c_float(feature_ratio), ct.c_uint(edge))) return out
[docs]def harris(image, max_corners=500, min_response=1E5, sigma=1.0, block_size=0, k_thr=0.04): """ Harris corner detector. Parameters ---------- image : af.Array A 2D array specifying an image. max_corners : scalar. optional. default: 500. Specifies the maximum number of corners to be calculated. min_response : scalar. optional. default: 1E5 Specifies the cutoff score for a corner to be considered sigma : scalar. optional. default: 1.0 - Specifies the standard deviation of a circular window. - Only used when block_size == 0. Must be >= 0.5 and <= 5.0. block_size : scalar. optional. default: 0 Specifies the window size. k_thr : scalar. optional. default: 0.04 Harris constant. must be >= 0.01 Returns --------- features : af.Features() Contains the location and score. Orientation and size are not computed. Note ------ The covariation matrix will be square when `block_size` is used and circular when `sigma` is used. """ out = Features() safe_call(backend.get().af_harris(ct.pointer(out.feat), image.arr, ct.c_uint(max_corners), ct.c_float(min_response), ct.c_float(sigma), ct.c_uint(block_size), ct.c_float(k_thr))) return out
[docs]def orb(image, threshold=20.0, max_features=400, scale = 1.5, num_levels = 4, blur_image = False): """ ORB Feature descriptor. Parameters ---------- image : af.Array A 2D array representing an image. threshold : scalar. optional. default: 20.0. FAST threshold for which a pixel of the circle around a central pixel is consdered. max_features : scalar. optional. default: 400. Specifies the maximum number of features to be considered. scale : scalar. optional. default: 1.5. Specifies the factor by which images are down scaled at each level. num_levles : scalar. optional. default: 4. Specifies the number of levels used in the image pyramid. blur_image : Boolean. optional. default: False. Flag specifying if the input has to be blurred before computing descriptors. A gaussian filter with sigma = 2 is applied if True. Returns --------- (features, descriptor) : tuple of (af.Features(), af.Array) - descriptor is an af.Array of size N x 8 """ feat = Features() desc = Array() safe_call(backend.get().af_orb(ct.pointer(feat.feat), ct.pointer(desc.arr), ct.c_float(threshold), ct.c_uint(max_features), ct.c_float(scale), ct.c_uint(num_levels), blur_image)) return feat, desc
[docs]def hamming_matcher(query, database, dim = 0, num_nearest = 1): """ Hamming distance matcher. Parameters ----------- query : af.Array A query feature descriptor database : af.Array A multi dimensional array containing the feature descriptor database. dim : scalar. optional. default: 0. Specifies the dimension along which feature descriptor lies. num_nearest: scalar. optional. default: 1. Specifies the number of nearest neighbors to find. Returns --------- (location, distance): tuple of af.Array location and distances of closest matches. """ index = Array() dist = Array() safe_call(backend.get().af_hamming_matcher(ct.pointer(idx.arr), ct.pointer(dist.arr), query.arr, database.arr, c_dim_t(dim), c_dim_t(num_nearest))) return index, dist
[docs]def nearest_neighbour(query, database, dim = 0, num_nearest = 1, match_type=MATCH.SSD): """ Nearest Neighbour matcher. Parameters ----------- query : af.Array A query feature descriptor database : af.Array A multi dimensional array containing the feature descriptor database. dim : scalar. optional. default: 0. Specifies the dimension along which feature descriptor lies. num_nearest: scalar. optional. default: 1. Specifies the number of nearest neighbors to find. match_type: optional: af.MATCH. default: af.MATCH.SSD Specifies the match function metric. Returns --------- (location, distance): tuple of af.Array location and distances of closest matches. """ index = Array() dist = Array() safe_call(backend.get().af_nearest_neighbour(ct.pointer(idx.arr), ct.pointer(dist.arr), query.arr, database.arr, c_dim_t(dim), c_dim_t(num_nearest), match_type.value)) return index, dist
[docs]def match_template(image, template, match_type = MATCH.SAD): """ Find the closest match of a template in an image. Parameters ---------- image : af.Array A multi dimensional array specifying an image or batch of images. template : af.Array A multi dimensional array specifying a template or batch of templates. match_type: optional: af.MATCH. default: af.MATCH.SAD Specifies the match function metric. Returns -------- out : af.Array An array containing the score of the match at each pixel. """ out = Array() safe_call(backend.get().af_match_template(ct.pointer(out.arr), image.arr, template.arr, match_type.value)) return out
[docs]def susan(image, radius=3, diff_thr=32, geom_thr=10, feature_ratio=0.05, edge=3): """ SUSAN corner detector. Parameters ---------- image : af.Array A 2D array specifying an image. radius : scalar. optional. default: 500. Specifies the radius of each pixel neighborhood. diff_thr : scalar. optional. default: 1E5 Specifies the intensity difference threshold. geom_thr : scalar. optional. default: 1.0 Specifies the geometric threshold. feature_ratio : scalar. optional. default: 0.05 (5%) Specifies the ratio of corners found to number of pixels. edge : scalar. optional. default: 3 Specifies the number of edge rows and columns that are ignored. Returns --------- features : af.Features() Contains the location and score. Orientation and size are not computed. """ out = Features() safe_call(backend.get().af_susan(ct.pointer(out.feat), image.arr, ct.c_uint(radius), ct.c_float(diff_thr), ct.c_float(geom_thr), ct.c_float(feature_ratio), ct.c_uint(edge))) return out
[docs]def dog(image, radius1, radius2): """ Difference of gaussians. Parameters ---------- image : af.Array A 2D array specifying an image. radius1 : scalar. The radius of first gaussian kernel. radius2 : scalar. The radius of second gaussian kernel. Returns -------- out : af.Array A multi dimensional array containing the difference of gaussians. Note ------ The sigma values are calculated to be 0.25 * radius. """ out = Array() safe_call(backend.get().af_dog(ct.pointer(out.arr), image.arr, radius1, radius2)) return out
[docs]def sift(image, num_layers=3, contrast_threshold=0.04, edge_threshold=10.0, initial_sigma = 1.6, double_input = True, intensity_scale = 0.00390625, feature_ratio = 0.05): """ SIFT feature detector and descriptor. Parameters ---------- image : af.Array A 2D array representing an image num_layers : optional: integer. Default: 3 Number of layers per octave. The number of octaves is calculated internally. contrast_threshold : optional: float. Default: 0.04 Threshold used to filter out features that have low contrast. edge_threshold : optional: float. Default: 10.0 Threshold used to filter out features that are too edge-like. initial_sigma : optional: float. Default: 1.6 The sigma value used to filter the input image at the first octave. double_input : optional: bool. Default: True If True, the input image will be scaled to double the size for the first octave. intensity_scale : optional: float. Default: 1.0/255 The inverse of the difference between maximum and minimum intensity values. feature_ratio : optional: float. Default: 0.05 Specifies the maximum number of features to detect as a ratio of image pixels. Returns -------- (features, descriptor) : tuple of (af.Features(), af.Array) - descriptor is an af.Array of size N x 128 """ feat = Features() desc = Array() safe_call(af_sift(ct.pointer(feat), ct.pointer(desc), image.arr, num_layers, contrast_threshold, edge_threshold, initial_sigma, double_input, intensity_scale, feature_ratio)) return (feat, desc)
[docs]def gloh(image, num_layers=3, contrast_threshold=0.04, edge_threshold=10.0, initial_sigma = 1.6, double_input = True, intensity_scale = 0.00390625, feature_ratio = 0.05): """ GLOH feature detector and descriptor. Parameters ---------- image : af.Array A 2D array representing an image num_layers : optional: integer. Default: 3 Number of layers per octave. The number of octaves is calculated internally. contrast_threshold : optional: float. Default: 0.04 Threshold used to filter out features that have low contrast. edge_threshold : optional: float. Default: 10.0 Threshold used to filter out features that are too edge-like. initial_sigma : optional: float. Default: 1.6 The sigma value used to filter the input image at the first octave. double_input : optional: bool. Default: True If True, the input image will be scaled to double the size for the first octave. intensity_scale : optional: float. Default: 1.0/255 The inverse of the difference between maximum and minimum intensity values. feature_ratio : optional: float. Default: 0.05 Specifies the maximum number of features to detect as a ratio of image pixels. Returns -------- (features, descriptor) : tuple of (af.Features(), af.Array) - descriptor is an af.Array of size N x 272 """ feat = Features() desc = Array() safe_call(af_gloh(ct.pointer(feat), ct.pointer(desc), image.arr, num_layers, contrast_threshold, edge_threshold, initial_sigma, double_input, intensity_scale, feature_ratio)) return (feat, desc)
[docs]def homography(x_src, y_src, x_dst, y_dst, htype = HOMOGRAPHY.RANSAC, ransac_threshold = 3.0, iters = 1000, out_type = Dtype.f32): """ Homography estimation Parameters ---------- x_src : af.Array A list of x co-ordinates of the source points. y_src : af.Array A list of y co-ordinates of the source points. x_dst : af.Array A list of x co-ordinates of the destination points. y_dst : af.Array A list of y co-ordinates of the destination points. htype : optional: af.HOMOGRAPHY. Default: HOMOGRAPHY.RANSAC htype can be one of - HOMOGRAPHY.RANSAC: RANdom SAmple Consensus will be used to evaluate quality. - HOMOGRAPHY.LMEDS : Least MEDian of Squares is used to evaluate quality. ransac_threshold : optional: scalar. Default: 3.0 If `htype` is HOMOGRAPHY.RANSAC, it specifies the L2-distance threshold for inliers. out_type : optional. af.Dtype. Default: Dtype.f32. Specifies the output data type. Returns ------- (H, inliers) : A tuple of (af.Array, integer) """ H = Array() inliers = ct.c_int(0) safe_call(backend.get().af_homography(ct.pointer(H), ct.pointer(inliers), x_src.arr, y_src.arr, x_dst.arr, y_dst.arr, htype.value, ransac_threshold, iters, out_type.value)) return (H, inliers)