#include <cmath>
#include <cstdio>
#include <cstdlib>
array threshold(
const array &in,
float thresholdValue)
{
int channels = in.
dims(2);
if (channels>1)
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 hist = histogram(gray, 256, 0.0f, 255.0f);
array sumB = accum(wts*hist);
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>();
array threshIdx = where(interClsVar >= max);
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;
array bimodal =
loadImage(ASSETS_DIR
"/examples/images/noisy_square.png",
false);
bimodal =
resize(0.75f, bimodal);
array bt = threshold(bimodal, 180.0f);
array ot = otsu(bimodal);
std::cout << "Press ESC while the window is in focus to proceed to exit" << std::endl;
while (!wnd.close()) {
wnd.grid(3, 3);
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.
Definition graphics.h:37
A multi dimensional data container.
Definition array.h:27
Definition exception.h:20
virtual const char * what() const
Definition exception.h:34
seq is used to create seq for indexing af::array
Definition seq.h:46
@ AF_GRAY
Grayscale.
Definition defines.h:296
@ AF_RGB
3-channel RGB
Definition defines.h:297
AFAPI void setDevice(const int device)
Sets the current device.
AFAPI array gaussianKernel(const int rows, const int cols, const double sig_r=0, const double sig_c=0)
C++ Interface for generating gausian kernels.
AFAPI array histogram(const array &in, const unsigned nbins, const double minval, const double maxval)
C++ Interface for histogram.
AFAPI array loadImage(const char *filename, const bool is_color=false)
C++ Interface for loading an image.
T scalar() const
Get the first element of the array as a scalar.
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 number of elements in array
array copy() const
Perform deep copy of the array.
AFAPI array sum(const array &in, const int dim=-1)
C++ Interface for sum of elements in an array.
AFAPI 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.
Definition algorithm.h:15