#include <cmath>
#include <cstdio>
#include <cstdlib>
array threshold(
const array& in,
float thresholdValue) {
int channels = in.
dims(2);
ret_val =
(ret_val < thresholdValue) * 0.0f + 255.0f * (ret_val > thresholdValue);
return ret_val;
}
int channels = in.
dims(2);
if (channels > 1)
else
gray = in;
array meanB = sumB / wtB;
float lastElemInSumB;
sumB(
seq(255, 255, 1)).
host((
void*)&lastElemInSumB);
array meanF = (lastElemInSumB - sumB) / wtF;
array mDiff = meanB - meanF;
array interClsVar = wtB * wtF * mDiff * mDiff;
float threshold2 =
where(interClsVar ==
max).scalar<
unsigned>();
float threshold1 =
threshIdx.elements() > 0 ? threshIdx.scalar<unsigned>() : 0.0f;
return threshold(gray, (threshold1 + threshold2) / 2.0f);
}
int main(int argc, char** argv) {
try {
int device = argc > 1 ? atoi(argv[1]) : 0;
loadImage(ASSETS_DIR
"/examples/images/noisy_square.png",
false);
bimodal =
resize(0.75f, bimodal);
array bt = threshold(bimodal, 180.0f);
array ot = otsu(bimodal);
af::Window wnd(1536, 1024,
"Binary Thresholding Algorithms");
printf("Press ESC while the window is in focus to proceed to exit\n");
wnd.grid(3, 3);
wnd(0, 1).setAxesTitles("Bins", "Frequency");
wnd(1, 1).setAxesTitles("Bins", "Frequency");
wnd(2, 1).setAxesTitles("Bins", "Frequency");
while (!wnd.close()) {
wnd(0, 0).image(bimodal / 255, "Input Image");
wnd(1, 0).image(bimodal / 255, "Input Image");
wnd(2, 0).image(smooth / 255, "Input Smoothed by Gaussian Filter");
wnd(0, 1).hist(bimodHist, 0, 255, "Input Histogram");
wnd(1, 1).hist(bimodHist, 0, 255, "Input Histogram");
wnd(2, 1).hist(smoothHist, 0, 255, "Smoothed Input Histogram");
wnd(0, 2).image(bt, "Simple Binary threshold");
wnd(1, 2).image(ot, "Otsu's Threshold");
wnd(2, 2).image(otsu(smooth), "Otsu's Threshold on Smoothed Image");
wnd.show();
}
fprintf(stderr,
"%s\n", e.
what());
throw;
}
return 0;
}
Window object to render af::arrays.
A multi dimensional data container.
dim4 dims() const
Get dimensions of the array.
T * host() const
Copy array data to host and return host pointer.
dim_t elements() const
Get the total number of elements across all dimensions of the array.
array copy() const
Perform deep copy of the array.
An ArrayFire exception class.
virtual const char * what() const
Returns an error message for the exception in a string format.
seq is used to create sequences for indexing af::array
array range(const dim4 &dims, const int seq_dim=-1, const dtype ty=f32)
C++ Interface to generate an array with [0, n-1] values along the seq_dim dimension and tiled across ...
void setDevice(const int device)
Sets the current device.
array colorSpace(const array &image, const CSpace to, const CSpace from)
C++ Interface wrapper for colorspace conversion.
array gaussianKernel(const int rows, const int cols, const double sig_r=0, const double sig_c=0)
C++ Interface for generating gausian kernels.
array histogram(const array &in, const unsigned nbins, const double minval, const double maxval)
C++ Interface for histogram.
array loadImage(const char *filename, const bool is_color=false)
C++ Interface for loading an image.
array max(const array &in, const int dim=-1)
C++ Interface to return the maximum along a given dimension.
array accum(const array &in, const int dim=0)
C++ Interface to evaluate the cumulative sum (inclusive) along a given dimension.
array where(const array &in)
C++ Interface to locate the indices of the non-zero values in an array.
array convolve(const array &signal, const array &filter, const convMode mode=AF_CONV_DEFAULT, const convDomain domain=AF_CONV_AUTO)
C++ Interface for convolution any(one through three) dimensional signals.