繁体   English   中英

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

[英]how to change the black pixels in the below image to red pixels using opencv libraries with c++

球

我想将图像中的黑色像素更改为红色像素,以使球看起来应该是白色和红色。 我想使用OpenCV库并用C ++编写代码。 我尝试将图像转换为RGB。

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

在此处输入图片说明

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM