Apply Black Hat Operation to an Image using OpenCV

Apply Black Hat Operation to an Image using OpenCV

Black hat (also known as bottom hat) is a morphological image processing operation. It is the difference between image on which applied closing operation and input image. Black hat operation is commonly used for grayscale images, but it can be used for binary images as well. This operation is useful for isolating pixels that are darker than neighborhood pixels.

The morphologyEx function with MORPH_BLACKHAT parameter can be used to apply the black hat operation to an image.

import cv2
import numpy as np

inputImg = cv2.imread('test.jpg')
inputImg = cv2.cvtColor(inputImg, cv2.COLOR_BGR2GRAY)

kernel = np.ones((4, 4))
outputImg = cv2.morphologyEx(inputImg, cv2.MORPH_BLACKHAT, kernel)

cv2.imshow('Input image', inputImg)
cv2.imshow('Output image', outputImg)
cv2.waitKey(0)
cv2.destroyAllWindows()
#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
    Mat inputImg = imread("test.jpg");
    cvtColor(inputImg, inputImg, COLOR_BGR2GRAY);

    Mat kernel = getStructuringElement(MORPH_RECT, Size(4, 4));
    Mat outputImg;
    morphologyEx(inputImg, outputImg, MORPH_BLACKHAT, kernel);

    imshow("Input image", inputImg);
    imshow("Output image", outputImg);
    waitKey(0);
    destroyAllWindows();

    return 0;
}
#include <opencv2/opencv.hpp>
#include <opencv2/cudaimgproc.hpp>
#include <opencv2/cudafilters.hpp>

using namespace cv;

int main()
{
    Mat img = imread("test.jpg");
    cuda::GpuMat gpuInputImg(img), gpuOutpuImg;
    cuda::cvtColor(gpuInputImg, gpuInputImg, COLOR_RGB2GRAY);
    Mat inputImg(gpuInputImg);

    Mat kernel = getStructuringElement(MORPH_RECT, Size(4, 4));
    Ptr<cuda::Filter> filter = cuda::createMorphologyFilter(MORPH_BLACKHAT, gpuInputImg.type(), kernel);
    filter->apply(gpuInputImg, gpuOutpuImg);
    Mat outputImg(gpuOutpuImg);

    imshow("Input image", inputImg);
    imshow("Output image", outputImg);
    waitKey(0);
    destroyAllWindows();

    return 0;
}
package app;

import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;

public class Main
{
    static { System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }

    public static void main(String[] args)
    {
        Mat inputImg = Imgcodecs.imread("test.jpg");
        Imgproc.cvtColor(inputImg, inputImg, Imgproc.COLOR_BGR2GRAY);

        Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(4, 4));
        Mat outputImg = new Mat();
        Imgproc.morphologyEx(inputImg, outputImg, Imgproc.MORPH_BLACKHAT, kernel);

        HighGui.imshow("Input image", inputImg);
        HighGui.imshow("Output image", outputImg);
        HighGui.waitKey(0);
        HighGui.destroyAllWindows();

        System.exit(0);
    }
}
Black hat operation applied to an image using OpenCV

Leave a Comment

Cancel reply

Your email address will not be published.