mirror of
https://github.com/lovell/sharp.git
synced 2025-12-19 07:15:08 +01:00
Expose erode and dilate operations #4243
This commit is contained in:
committed by
Lovell Fuller
parent
03e1b19764
commit
031c808aa5
@@ -472,4 +472,26 @@ namespace sharp {
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Dilate an image
|
||||
*/
|
||||
VImage Dilate(VImage image, int const width) {
|
||||
int const maskWidth = 2 * width + 1;
|
||||
VImage mask = VImage::new_matrix(maskWidth, maskWidth);
|
||||
return image.morph(
|
||||
mask,
|
||||
VIPS_OPERATION_MORPHOLOGY_DILATE).invert();
|
||||
}
|
||||
|
||||
/*
|
||||
* Erode an image
|
||||
*/
|
||||
VImage Erode(VImage image, int const width) {
|
||||
int const maskWidth = 2 * width + 1;
|
||||
VImage mask = VImage::new_matrix(maskWidth, maskWidth);
|
||||
return image.morph(
|
||||
mask,
|
||||
VIPS_OPERATION_MORPHOLOGY_ERODE).invert();
|
||||
}
|
||||
|
||||
} // namespace sharp
|
||||
|
||||
@@ -120,6 +120,15 @@ namespace sharp {
|
||||
VImage EmbedMultiPage(VImage image, int left, int top, int width, int height,
|
||||
VipsExtend extendWith, std::vector<double> background, int nPages, int *pageHeight);
|
||||
|
||||
/*
|
||||
* Dilate an image
|
||||
*/
|
||||
VImage Dilate(VImage image, int const maskWidth);
|
||||
|
||||
/*
|
||||
* Erode an image
|
||||
*/
|
||||
VImage Erode(VImage image, int const maskWidth);
|
||||
} // namespace sharp
|
||||
|
||||
#endif // SRC_OPERATIONS_H_
|
||||
|
||||
@@ -609,6 +609,16 @@ class PipelineWorker : public Napi::AsyncWorker {
|
||||
image = sharp::Threshold(image, baton->threshold, baton->thresholdGrayscale);
|
||||
}
|
||||
|
||||
// Dilate - must happen before blurring, due to the utility of dilating after thresholding
|
||||
if (baton->dilateWidth != 0) {
|
||||
image = sharp::Dilate(image, baton->dilateWidth);
|
||||
}
|
||||
|
||||
// Erode - must happen before blurring, due to the utility of eroding after thresholding
|
||||
if (baton->erodeWidth != 0) {
|
||||
image = sharp::Erode(image, baton->erodeWidth);
|
||||
}
|
||||
|
||||
// Blur
|
||||
if (shouldBlur) {
|
||||
image = sharp::Blur(image, baton->blurSigma, baton->precision, baton->minAmpl);
|
||||
@@ -1621,6 +1631,8 @@ Napi::Value pipeline(const Napi::CallbackInfo& info) {
|
||||
baton->gammaOut = sharp::AttrAsDouble(options, "gammaOut");
|
||||
baton->linearA = sharp::AttrAsVectorOfDouble(options, "linearA");
|
||||
baton->linearB = sharp::AttrAsVectorOfDouble(options, "linearB");
|
||||
baton->dilateWidth = sharp::AttrAsUint32(options, "dilateWidth");
|
||||
baton->erodeWidth = sharp::AttrAsUint32(options, "erodeWidth");
|
||||
baton->greyscale = sharp::AttrAsBool(options, "greyscale");
|
||||
baton->normalise = sharp::AttrAsBool(options, "normalise");
|
||||
baton->normaliseLower = sharp::AttrAsUint32(options, "normaliseLower");
|
||||
|
||||
@@ -101,6 +101,8 @@ struct PipelineBaton {
|
||||
int trimOffsetTop;
|
||||
std::vector<double> linearA;
|
||||
std::vector<double> linearB;
|
||||
int dilateWidth;
|
||||
int erodeWidth;
|
||||
double gamma;
|
||||
double gammaOut;
|
||||
bool greyscale;
|
||||
@@ -274,6 +276,8 @@ struct PipelineBaton {
|
||||
trimOffsetTop(0),
|
||||
linearA{},
|
||||
linearB{},
|
||||
dilateWidth(0),
|
||||
erodeWidth(0),
|
||||
gamma(0.0),
|
||||
greyscale(false),
|
||||
normalise(false),
|
||||
|
||||
Reference in New Issue
Block a user