Currently we have an IJS that is an image for which bitDepth>=8
There is a specific kind of images that are called 'Mask' that has bitDepth=1 and for which very few algorithms applies.
We would need to be able to write code like:
```javascript=
import {Mask} from 'image-js';
const mask = new Mask(100, 200);
for (let row=0; row<mask.height; row++) {
for (let column=0; column<mask.width; column++) {
// setBit accepts boolean or number
mask.setBit(row, column, (row+column)%2===0);
}
}
const image = mask.toGrey();
```
The data could be stored in a Uint8_array and the value either 0 or 1. We could improve this if we want to save some memory and store 8 pixels in one byte later if needed but it could be slower.
0 = black pixel, 1 = white pixel.
Class fields:
- width
- height
- size
- depth: 1
- colorModel: BINARY
- components: 1
- channels: 1
- alpha: false
- maxValue: 1
We could implement the following methods:
- setBit(row, column, value: boolean | number)
- setBitByIndex(index: number, value: boolean|number)
- getBit(row, column) : number
- getBitByIndex(index: number): number
- convertColor(ImageColorModel.GREY)
- fill(value: number | boolean)
- clone()
- invert()
A mask could also be created from a greyscale image:
```javascript=
const mask = threshold(image, {algorithm: '', threshold:})
```
And the current implementation of `threshold` should be changed to return a Mask:
https://github.com/image-js/image-js-typescript/blob/6fab889a67ff551a4b8c215ec3ef55ba89a0e164/src/operations/threshold.ts#L109-L124
write methods should be able to handle a Mask.
Here are some of the specific methods than can be applied on `Mask`:
- erode: https://github.com/image-js/image-js/blob/legacy/src/image/morphology/erode.js
- dilate: https://github.com/image-js/image-js/blob/legacy/src/image/morphology/dilate.js
- open: https://github.com/image-js/image-js/blob/legacy/src/image/morphology/open.js