如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素

Posted

技术标签:

【中文标题】如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素【英文标题】:how to change the black pixels in the below image to red pixels using opencv libraries with c++ 【发布时间】:2016-01-21 08:22:08 【问题描述】:

我想将图像中的黑色像素更改为红色像素,这样球应该看起来是白色和红色的。我想使用 OpenCV 库并用 C++ 对其进行编码。我已经尝试将图像转换为 RGB。

【问题讨论】:

我会使用graphics32.org/wiki 请显示您尝试过的内容。 只是为了好玩,您无需编写任何代码,直接在命令行中使用 ImageMagick 即可完成(大多数 Linux 发行版上都安装了它,并且可用于 OS X 和Windows)像这样...convert ball.jpg -fuzz 50% -fill red -opaque black result.png 【参考方案1】:

常见的方法是对图像进行阈值处理,因此在您的情况下,您会说强度小于某个阈值的每个像素将被视为黑色,然后重新着色为红色。找到一个好的阈值(将图像的像素分为两类(“更黑”和“更白”))的一种方法是 OTSU 阈值:

int main()

    cv::Mat input = cv::imread("../inputData/ball_thresholding.jpg");

    cv::Mat gray;
    cv::cvtColor(input,gray,CV_BGR2GRAY);

    cv::Mat mask;
    // compute inverse thresholding (dark areas become "active" pixel in the mask) with OTSU thresholding:
    double grayThres = cv::threshold(gray, mask, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);

    // color all masked pixel red:
    input.setTo(cv::Scalar(0,0,255), mask);

    // compute median filter to remove the whitish black parts and darker white parts

    cv::imshow("input", input);
    cv::waitKey(0);
    return 0;

给这个面具:

这个结果:

对于此图像,OTSU 计算的阈值为 127,这意味着每个灰度像素强度为 127 或更低(或小于 127,我不确定)将重新着色为红色。

如果您想保持黑色/红色区域的阴影效果,您可以删除 input.setTo(cv::Scalar(0,0,255), mask); lind 并将其替换为:

// keep the shading:
    for(int j=0; j<input.rows; ++j)
        for(int i=0; i<input.cols; ++i)
        
            if(mask.at<unsigned char>(j,i))
            
                input.at<cv::Vec3b>(j,i)[2] = 255;
            
        

这将导致 int:

【讨论】:

【参考方案2】:
cv::Mat imBW = imread('bwImg.jpg',CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat RGB_img = cv::Mat(imBW.rows, imBW.cols, CV_8UC3);
cv::Mat R_channel = 255-imBW;
cv::Mat B_channel = cv::Mat::zeros(imBW.rows, imBW.cols, CV_8UC1);
cv::Mat G_channel = cv::Mat::zeros(imBW.rows, imBW.cols, CV_8UC1);
vector<cv::Mat> channels;
channels.push_back(B_channel);
channels.push_back(G_channel);
channels.push_back(R_channel);
cv::merge(channels, RGB_img);

【讨论】:

你试过那个代码了吗?导致图像在我的代码执行尝试中以前的黑色变为白色,以前的白色变为黄色。如果您还原 channel.push_back(以便排序为 B、G、R),那么它将是蓝色背景的粉红色球。但我认为 B 和 G 通道具有未初始化的内存值,因此每个程序执行时颜色可能会有所不同? 更正了 BGR 序列。我没有尝试这段代码。给出一个大概的想法。初始化为零 @Micka 是的,它奏效了。非常感谢你帮助我

以上是关于如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用C ++从opencv中的磁盘仅读取一个图像颜色通道

如何使用opencv获取已经灰度化二值化的一张黑色图片中的一个亮点的具体像素坐标

如何去除opencv中的二值图像噪声?

使用opencv c ++裁剪视频中的ROI

如何将一个点附加到opencv c中的另一个点

如何使用 opencv 库将 3D 矩阵的元素归零?