UNPKG

@techstark/opencv-js

Version:

OpenCV JavaScript version for node.js or browser

400 lines (380 loc) 15.4 kB
import type { bool, double, float, InputArray, InputArrayOfArrays, int, OutputArray, Size, } from "./_types"; /* * # Histograms * */ /** * The function [cv::calcBackProject] calculates the back project of the histogram. That is, similarly * to [calcHist] , at each location (x, y) the function collects the values from the selected channels * in the input images and finds the corresponding histogram bin. But instead of incrementing it, the * function reads the bin value, scales it by scale , and stores in backProject(x,y) . In terms of * statistics, the function computes probability of each element value in respect with the empirical * probability distribution represented by the histogram. See how, for example, you can find and track * a bright-colored object in a scene: * * Before tracking, show the object to the camera so that it covers almost the whole frame. Calculate a * hue histogram. The histogram may have strong maximums, corresponding to the dominant colors in the * object. * When tracking, calculate a back projection of a hue plane of each input video frame using that * pre-computed histogram. Threshold the back projection to suppress weak colors. It may also make * sense to suppress pixels with non-sufficient color saturation and too dark or too bright pixels. * Find connected components in the resulting picture and choose, for example, the largest component. * * This is an approximate algorithm of the CamShift color object tracker. * * [calcHist], [compareHist] * * @param images Source arrays. They all should have the same depth, CV_8U, CV_16U or CV_32F , and the * same size. Each of them can have an arbitrary number of channels. * * @param nimages Number of source images. * * @param channels The list of channels used to compute the back projection. The number of channels * must match the histogram dimensionality. The first array channels are numerated from 0 to * images[0].channels()-1 , the second array channels are counted from images[0].channels() to * images[0].channels() + images[1].channels()-1, and so on. * * @param hist Input histogram that can be dense or sparse. * * @param backProject Destination back projection array that is a single-channel array of the same size * and depth as images[0] . * * @param ranges Array of arrays of the histogram bin boundaries in each dimension. See calcHist . * * @param scale Optional scale factor for the output back projection. * * @param uniform Flag indicating whether the histogram is uniform or not (see above). */ export declare function calcBackProject( images: any, nimages: int, channels: any, hist: InputArray, backProject: OutputArray, ranges: any, scale?: double, uniform?: bool, ): void; /** * This is an overloaded member function, provided for convenience. It differs from the above function * only in what argument(s) it accepts. */ export declare function calcBackProject( images: any, nimages: int, channels: any, hist: any, backProject: OutputArray, ranges: any, scale?: double, uniform?: bool, ): void; /** * This is an overloaded member function, provided for convenience. It differs from the above function * only in what argument(s) it accepts. */ export declare function calcBackProject( images: InputArrayOfArrays, channels: any, hist: InputArray, dst: OutputArray, ranges: any, scale: double, ): void; /** * The function [cv::calcHist] calculates the histogram of one or more arrays. The elements of a tuple * used to increment a histogram bin are taken from the corresponding input arrays at the same * location. The sample below shows how to compute a 2D Hue-Saturation histogram for a color image. : * * ```cpp * #include <opencv2/imgproc.hpp> * #include <opencv2/highgui.hpp> * * using namespace cv; * * int main( int argc, char** argv ) * { * Mat src, hsv; * if( argc != 2 || !(src=imread(argv[1], 1)).data ) * return -1; * * cvtColor(src, hsv, COLOR_BGR2HSV); * * // Quantize the hue to 30 levels * // and the saturation to 32 levels * int hbins = 30, sbins = 32; * int histSize[] = {hbins, sbins}; * // hue varies from 0 to 179, see cvtColor * float hranges[] = { 0, 180 }; * // saturation varies from 0 (black-gray-white) to * // 255 (pure spectrum color) * float sranges[] = { 0, 256 }; * const float* ranges[] = { hranges, sranges }; * MatND hist; * // we compute the histogram from the 0-th and 1-st channels * int channels[] = {0, 1}; * * calcHist( &hsv, 1, channels, Mat(), // do not use mask * hist, 2, histSize, ranges, * true, // the histogram is uniform * false ); * double maxVal=0; * minMaxLoc(hist, 0, &maxVal, 0, 0); * * int scale = 10; * Mat histImg = Mat::zeros(sbins*scale, hbins*10, CV_8UC3); * * for( int h = 0; h < hbins; h++ ) * for( int s = 0; s < sbins; s++ ) * { * float binVal = hist.at<float>(h, s); * int intensity = cvRound(binVal*255/maxVal); * rectangle( histImg, Point(h*scale, s*scale), * Point( (h+1)*scale - 1, (s+1)*scale - 1), * Scalar::all(intensity), * -1 ); * } * * namedWindow( "Source", 1 ); * imshow( "Source", src ); * * namedWindow( "H-S Histogram", 1 ); * imshow( "H-S Histogram", histImg ); * waitKey(); * } * ``` * * @param images Source arrays. They all should have the same depth, CV_8U, CV_16U or CV_32F , and the * same size. Each of them can have an arbitrary number of channels. * * @param nimages Number of source images. * * @param channels List of the dims channels used to compute the histogram. The first array channels * are numerated from 0 to images[0].channels()-1 , the second array channels are counted from * images[0].channels() to images[0].channels() + images[1].channels()-1, and so on. * * @param mask Optional mask. If the matrix is not empty, it must be an 8-bit array of the same size as * images[i] . The non-zero mask elements mark the array elements counted in the histogram. * * @param hist Output histogram, which is a dense or sparse dims -dimensional array. * * @param dims Histogram dimensionality that must be positive and not greater than CV_MAX_DIMS (equal * to 32 in the current OpenCV version). * * @param histSize Array of histogram sizes in each dimension. * * @param ranges Array of the dims arrays of the histogram bin boundaries in each dimension. When the * histogram is uniform ( uniform =true), then for each dimension i it is enough to specify the lower * (inclusive) boundary $L_0$ of the 0-th histogram bin and the upper (exclusive) boundary * $U_{\texttt{histSize}[i]-1}$ for the last histogram bin histSize[i]-1 . That is, in case of a * uniform histogram each of ranges[i] is an array of 2 elements. When the histogram is not uniform ( * uniform=false ), then each of ranges[i] contains histSize[i]+1 elements: $L_0, U_0=L_1, U_1=L_2, * ..., U_{\texttt{histSize[i]}-2}=L_{\texttt{histSize[i]}-1}, U_{\texttt{histSize[i]}-1}$ . The array * elements, that are not between $L_0$ and $U_{\texttt{histSize[i]}-1}$ , are not counted in the * histogram. * * @param uniform Flag indicating whether the histogram is uniform or not (see above). * * @param accumulate Accumulation flag. If it is set, the histogram is not cleared in the beginning * when it is allocated. This feature enables you to compute a single histogram from several sets of * arrays, or to update the histogram in time. */ export declare function calcHist( images: any, nimages: int, channels: any, mask: InputArray, hist: OutputArray, dims: int, histSize: any, ranges: any, uniform?: bool, accumulate?: bool, ): void; /** * This is an overloaded member function, provided for convenience. It differs from the above function * only in what argument(s) it accepts. * * this variant uses SparseMat for output */ export declare function calcHist( images: any, nimages: int, channels: any, mask: InputArray, hist: any, dims: int, histSize: any, ranges: any, uniform?: bool, accumulate?: bool, ): void; /** * This is an overloaded member function, provided for convenience. It differs from the above function * only in what argument(s) it accepts. */ export declare function calcHist( images: InputArrayOfArrays, channels: any, mask: InputArray, hist: OutputArray, histSize: any, ranges: any, accumulate?: bool, ): void; /** * The function [cv::compareHist] compares two dense or two sparse histograms using the specified * method. * * The function returns `$d(H_1, H_2)$` . * * While the function works well with 1-, 2-, 3-dimensional dense histograms, it may not be suitable * for high-dimensional sparse histograms. In such histograms, because of aliasing and sampling * problems, the coordinates of non-zero histogram bins can slightly shift. To compare such histograms * or more general sparse configurations of weighted points, consider using the [EMD] function. * * @param H1 First compared histogram. * * @param H2 Second compared histogram of the same size as H1 . * * @param method Comparison method, see HistCompMethods */ export declare function compareHist( H1: InputArray, H2: InputArray, method: int, ): double; /** * This is an overloaded member function, provided for convenience. It differs from the above function * only in what argument(s) it accepts. */ export declare function compareHist(H1: any, H2: any, method: int): double; /** * @param clipLimit Threshold for contrast limiting. * * @param tileGridSize Size of grid for histogram equalization. Input image will be divided into * equally sized rectangular tiles. tileGridSize defines the number of tiles in row and column. */ export declare function createCLAHE( clipLimit?: double, tileGridSize?: Size, ): any; /** * The function computes the earth mover distance and/or a lower boundary of the distance between the * two weighted point configurations. One of the applications described in RubnerSept98, Rubner2000 is * multi-dimensional histogram comparison for image retrieval. EMD is a transportation problem that is * solved using some modification of a simplex algorithm, thus the complexity is exponential in the * worst case, though, on average it is much faster. In the case of a real metric the lower boundary * can be calculated even faster (using linear-time algorithm) and it can be used to determine roughly * whether the two signatures are far enough so that they cannot relate to the same object. * * @param signature1 First signature, a $\texttt{size1}\times \texttt{dims}+1$ floating-point matrix. * Each row stores the point weight followed by the point coordinates. The matrix is allowed to have a * single column (weights only) if the user-defined cost matrix is used. The weights must be * non-negative and have at least one non-zero value. * * @param signature2 Second signature of the same format as signature1 , though the number of rows may * be different. The total weights may be different. In this case an extra "dummy" point is added to * either signature1 or signature2. The weights must be non-negative and have at least one non-zero * value. * * @param distType Used metric. See DistanceTypes. * * @param cost User-defined $\texttt{size1}\times \texttt{size2}$ cost matrix. Also, if a cost matrix * is used, lower boundary lowerBound cannot be calculated because it needs a metric function. * * @param lowerBound Optional input/output parameter: lower boundary of a distance between the two * signatures that is a distance between mass centers. The lower boundary may not be calculated if the * user-defined cost matrix is used, the total weights of point configurations are not equal, or if the * signatures consist of weights only (the signature matrices have a single column). You must** * initialize *lowerBound . If the calculated distance between mass centers is greater or equal to * *lowerBound (it means that the signatures are far enough), the function does not calculate EMD. In * any case *lowerBound is set to the calculated distance between mass centers on return. Thus, if you * want to calculate both distance between mass centers and EMD, *lowerBound should be set to 0. * * @param flow Resultant $\texttt{size1} \times \texttt{size2}$ flow matrix: $\texttt{flow}_{i,j}$ is a * flow from $i$ -th point of signature1 to $j$ -th point of signature2 . */ export declare function EMD( signature1: InputArray, signature2: InputArray, distType: int, cost?: InputArray, lowerBound?: any, flow?: OutputArray, ): float; /** * The function equalizes the histogram of the input image using the following algorithm: * * Calculate the histogram `$H$` for src . * Normalize the histogram so that the sum of histogram bins is 255. * Compute the integral of the histogram: `\\[H'_i = \\sum _{0 \\le j < i} H(j)\\]` * Transform the image using `$H'$` as a look-up table: `$\\texttt{dst}(x,y) = H'(\\texttt{src}(x,y))$` * * The algorithm normalizes the brightness and increases the contrast of the image. * * @param src Source 8-bit single channel image. * * @param dst Destination image of the same size and type as src . */ export declare function equalizeHist(src: InputArray, dst: OutputArray): void; export declare function wrapperEMD( signature1: InputArray, signature2: InputArray, distType: int, cost?: InputArray, lowerBound?: any, flow?: OutputArray, ): float; /** * Correlation `\\[d(H_1,H_2) = \\frac{\\sum_I (H_1(I) - \\bar{H_1}) (H_2(I) - * \\bar{H_2})}{\\sqrt{\\sum_I(H_1(I) - \\bar{H_1})^2 \\sum_I(H_2(I) - \\bar{H_2})^2}}\\]` where * `\\[\\bar{H_k} = \\frac{1}{N} \\sum _J H_k(J)\\]` and `$N$` is a total number of histogram bins. * */ export declare const HISTCMP_CORREL: HistCompMethods; // initializer: = 0 /** * Chi-Square `\\[d(H_1,H_2) = \\sum _I \\frac{\\left(H_1(I)-H_2(I)\\right)^2}{H_1(I)}\\]` * */ export declare const HISTCMP_CHISQR: HistCompMethods; // initializer: = 1 /** * Intersection `\\[d(H_1,H_2) = \\sum _I \\min (H_1(I), H_2(I))\\]` * */ export declare const HISTCMP_INTERSECT: HistCompMethods; // initializer: = 2 /** * Bhattacharyya distance (In fact, OpenCV computes Hellinger distance, which is related to * Bhattacharyya coefficient.) `\\[d(H_1,H_2) = \\sqrt{1 - \\frac{1}{\\sqrt{\\bar{H_1} \\bar{H_2} N^2}} * \\sum_I \\sqrt{H_1(I) \\cdot H_2(I)}}\\]` * */ export declare const HISTCMP_BHATTACHARYYA: HistCompMethods; // initializer: = 3 export declare const HISTCMP_HELLINGER: HistCompMethods; // initializer: = HISTCMP_BHATTACHARYYA /** * Alternative Chi-Square `\\[d(H_1,H_2) = 2 * \\sum _I * \\frac{\\left(H_1(I)-H_2(I)\\right)^2}{H_1(I)+H_2(I)}\\]` This alternative formula is regularly used * for texture comparison. See e.g. Puzicha1997 * */ export declare const HISTCMP_CHISQR_ALT: HistCompMethods; // initializer: = 4 /** * Kullback-Leibler divergence `\\[d(H_1,H_2) = \\sum _I H_1(I) \\log * \\left(\\frac{H_1(I)}{H_2(I)}\\right)\\]` * */ export declare const HISTCMP_KL_DIV: HistCompMethods; // initializer: = 5 /** * Histogram comparison methods * */ export type HistCompMethods = any;