c++视觉处理----顶帽与黑帽

c++视觉处理----顶帽与黑帽

顶帽与黑帽区别

黑帽(Black Hat)和顶帽(Top Hat)是形态学图像处理中的两种操作,它们用于突出图像中不同类型的细节,具有以下主要区别:

  1. 突出的特征类型

    • 顶帽(Top Hat) 突出了图像中的小亮区域或物体,强调比周围区域更亮的细节。它是通过执行开运算后减去原始图像来实现的。
    • 黑帽(Black Hat) 突出了图像中的小暗区域或物体,强调比周围区域更暗的细节。它是通过执行闭运算后减去原始图像来实现的。
  2. 操作步骤

    • 顶帽(Top Hat) 操作包括执行开运算后减去原始图像。
    • 黑帽(Black Hat) 操作包括执行闭运算后减去原始图像。
  3. 适用性

    • 顶帽(Top Hat) 常用于检测亮度较高的小细节,例如图像中的小物体、噪点或微小亮度变化。
    • 黑帽(Black Hat) 常用于检测亮度较低的小细节,例如图像中的小暗区域、缺陷或微小阴影。
  4. 应用领域

    • 顶帽(Top Hat) 在物体检测、道路标线检测、细胞核分析等领域常被应用。
    • 黑帽(Black Hat) 在缺陷检测、文字识别、医学图像分析等领域常被应用。

总之,黑帽和顶帽是形态学操作中的两种不同类型,用于突出图像中的不同亮度特征。根据您的需求和图像特性,选择适当的操作来实现您的图像处理目标。

顶帽:cv::morphologyEx(grayscaleImage, tophatImage, cv::MORPH_TOPHAT, kernel);

顶帽操作的结果图像显示了原始图像中比周围区域更亮的细节。它是通过以下步骤实现的

#include 

int main() {
    // 读取灰度图像
    cv::Mat grayscaleImage = cv::imread("grayscale_image.jpg", cv::IMREAD_GRAYSCALE);

    if (grayscaleImage.empty()) {
        std::cerr << "Failed to open the grayscale image!" << std::endl;
        return -1;
    }

    // 定义结构元素核
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));

    // 创建一个空的输出图像
    cv::Mat tophatImage;

    // 执行顶帽操作
    cv::morphologyEx(grayscaleImage, tophatImage, cv::MORPH_TOPHAT, kernel);

    // 显示原始灰度图像和顶帽操作结果
    cv::namedWindow("Grayscale Image", cv::WINDOW_NORMAL);
    cv::namedWindow("Top Hat Image", cv::WINDOW_NORMAL);

    cv::imshow("Grayscale Image", grayscaleImage);
    cv::imshow("Top Hat Image", tophatImage);

    cv::waitKey(0);

    return 0;
}

c++视觉处理----顶帽与黑帽_第1张图片

黑帽:cv::morphologyEx(frame, blackhatImage, cv::MORPH_BLACKHAT, kernel);

#include 

int main() {
    // 读取灰度图像
    cv::Mat grayscaleImage = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);

    if (grayscaleImage.empty()) {
        std::cerr << "Failed to open the grayscale image!" << std::endl;
        return -1;
    }

    // 定义结构元素核
    cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5));

    // 创建一个空的输出图像
    cv::Mat blackhatImage;

    // 执行黑帽操作
    cv::morphologyEx(grayscaleImage, blackhatImage, cv::MORPH_BLACKHAT, kernel);

    // 显示原始灰度图像和黑帽操作结果
    cv::namedWindow("Grayscale Image", cv::WINDOW_NORMAL);
    cv::namedWindow("Black Hat Image", cv::WINDOW_NORMAL);

    cv::imshow("Grayscale Image", grayscaleImage);
    cv::imshow("Black Hat Image", blackhatImage);

    cv::waitKey(0);

    return 0;
}

c++视觉处理----顶帽与黑帽_第2张图片

相机实时顶帽处理

#include 

// 全局变量,用于存储滑动条的值
int kernelSize = 1; // 初始核大小为1

// 回调函数,用于处理滑动条的值变化
void onTrackbar(int value, void* userdata) {
    cv::VideoCapture* cap = static_cast<cv::VideoCapture*>(userdata);

    // 创建窗口
    cv::namedWindow("Live Camera Feed", cv::WINDOW_NORMAL);

    while (true) {
        cv::Mat frame;

        // 从相机中读取一帧图像
        *cap >> frame;

        if (frame.empty()) {
            std::cerr << "Failed to read frame from the camera!" << std::endl;
            break;
        }

        // 定义结构元素核
        cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(kernelSize, kernelSize));

        // 创建一个空的输出图像
        cv::Mat tophatImage;

        // 执行顶帽操作
        cv::morphologyEx(frame, tophatImage, cv::MORPH_TOPHAT, kernel);

        // 显示实时摄像头图像和顶帽操作的结果
        cv::imshow("Live Camera Feed", frame);
        cv::imshow("Top Hat Image", tophatImage);

        // 检查键盘输入,如果按下ESC键,退出循环
        char key = cv::waitKey(1);
        if (key == 27) // 27对应ESC键的ASCII码
            break;
    }
}

int main() {
    cv::VideoCapture cap(0);

    if (!cap.isOpened()) {
        std::cerr << "Could not open the camera!" << std::endl;
        return -1;
    }

    // 创建窗口
    cv::namedWindow("Live Camera Feed", cv::WINDOW_NORMAL);

    // 创建滑动条
    cv::createTrackbar("Kernel Size", "Live Camera Feed", &kernelSize, 30, onTrackbar, &cap);

    // 初始化一次滑动条回调函数以显示默认值
    onTrackbar(kernelSize, &cap);

    // 释放摄像头资源和关闭窗口
    cap.release();
    cv::destroyAllWindows();

    return 0;
}

相机实时黑帽处理

#include 

// 全局变量,用于存储滑动条的值
int kernelSize = 1; // 初始核大小为1

// 回调函数,用于处理滑动条的值变化
void onTrackbar(int value, void* userdata) {
    cv::VideoCapture* cap = static_cast<cv::VideoCapture*>(userdata);

    // 创建窗口
    cv::namedWindow("Live Camera Feed", cv::WINDOW_NORMAL);

    while (true) {
        cv::Mat frame;

        // 从相机中读取一帧图像
        *cap >> frame;

        if (frame.empty()) {
            std::cerr << "Failed to read frame from the camera!" << std::endl;
            break;
        }

        // 定义结构元素核
        cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(kernelSize, kernelSize));

        // 创建一个空的输出图像
        cv::Mat blackhatImage;

        // 执行黑帽操作
        cv::morphologyEx(frame, blackhatImage, cv::MORPH_BLACKHAT, kernel);

        // 显示实时摄像头图像和黑帽操作的结果
        cv::imshow("Live Camera Feed", frame);
        cv::imshow("Black Hat Image", blackhatImage);

        // 检查键盘输入,如果按下ESC键,退出循环
        char key = cv::waitKey(1);
        if (key == 27) // 27对应ESC键的ASCII码
            break;
    }
}

int main() {
    cv::VideoCapture cap(0);

    if (!cap.isOpened()) {
        std::cerr << "Could not open the camera!" << std::endl;
        return -1;
    }

    // 创建窗口
    cv::namedWindow("Live Camera Feed", cv::WINDOW_NORMAL);

    // 创建滑动条
    cv::createTrackbar("Kernel Size", "Live Camera Feed", &kernelSize, 30, onTrackbar, &cap);

    // 初始化一次滑动条回调函数以显示默认值
    onTrackbar(kernelSize, &cap);

    // 释放摄像头资源和关闭窗口
    cap.release();
    cv::destroyAllWindows();

    return 0;
}

你可能感兴趣的:(#,C++视觉处理,c++,计算机视觉,opencv)