---
title: "Thresholding Images"
date: "`r Sys.Date()`"
output: rmarkdown::html_vignette
vignette: >
  %\VignetteIndexEntry{Thresholding Images}
  %\VignetteEngine{knitr::rmarkdown}
  %\VignetteEncoding{UTF-8}
---

```{r setup, include=FALSE}
if (utils::packageVersion("knitr") >= "1.20.15") {
  knitr::opts_chunk$set(
    collapse = TRUE,
    comment = "#>",
    fig.width = 7, fig.height = 6,
    tidy = "styler"
  )
} else {
  knitr::opts_chunk$set(
    collapse = TRUE,
    comment = "#>",
    fig.width = 7, fig.height = 6
  )
}
```

# Thresholding Images

Although this package is for thresholding anything at all, it has added functionality for thresholding images. This vignette is all about thresholding single-frame, grayscale images. There's [another vignette](https://rorynolan.github.io/autothresholdr/articles/thresholding-image-stacks.html) about thresholding stacks of grayscale images.

```{r load libraries, results='hide'}
library(autothresholdr)
```

We'll be using the image that comes with the package:

```{r the image}
img <- ijtiff::read_tif(system.file("extdata", "fiji_eg.tif", 
                                    package = "autothresholdr"))
dim(img)
ijtiff::display(img)  # displays first channel, first frame
```

It's a picture of cells, the black part is where the cells are not. The threshold is supposed to tell us what is *dark* (not cell) and what is *bright* (cell). By playing around, we may discover that something like 20 might (for some purposes) be a good value.

```{r guess twenty}
ijtiff::display(img[, , 1, 1] > 20)
```

But what if we have many images and we don't want to *play around*, we want a method of calculating the threshold automatically. http://imagej.net/Auto_Threshold gives many such methods and they are provided to you in R via this package. Go to that webpage for a nice comparison of the methods.

The function `auto_thresh()` finds the threshold, `mask()` gets the mask (an array with a `TRUE` for elements exceeding the threshold and `FALSE` elsewhere) and `apply_mask()` applies the mask to the original image by setting the elements that don't exceed the threshold to `NA`.

Let's see each with "Triangle" thresholding.

```{r thresh mask apply}
auto_thresh(img, "tri")
ijtiff::display(mask(img, "tri"))
ijtiff::display(apply_mask(img, "tri"))
```

In this last image, the `NA` pixels are grey.

