在opencvc++中设置彩色图像中的像素(i,j)为黑色

Setting Pixel (i,j) in Color Image to Black in OpenCV C++

本文关键字:黑色 像素 设置 opencvc++ 彩色图像      更新时间:2023-10-16

我正在寻找分割彩色图像,以便尝试识别某些特征。我希望设置一个像素为黑色,如果它不满足一些决策规则,否则我想让像素与第一次读取时完全相同。

我正在阅读的图像使用:

Mat apples = imread("C:/Users.......", CV_LOAD_IMAGE_COLOR); 

到目前为止,我的尝试是将第i行和第j列的像素设置为黑色:

apples.at<uchar>(i,j) = 0;

当循环遍历图像的所有行和列时,它似乎跳过了图像的三分之二。

我也试过了:

Vec3b black;
black[0] = 0;
black[1] = 0;
black[2] = 0; 
apples.at<Vec3b>(i,j) = black;

似乎几乎将图像过滤为。任何帮助将不胜感激!

编辑我在图像矩阵上循环如下:

 for(int i=0;i<apples.rows;i++)
                {
                    for(int j=0;j<apples.cols;j++)
                        {
                            if(applescopy[0].at<uchar>(i,j) == 0 || applescopy[1].at<uchar>(i,j) == 0 || applescopy[2].at<uchar>(i,j) == 0 )
                              {
                                apples.at<Vec3b>(i,j) = black;
                              }
                        }
                }

如果我去掉第二个for语句末尾的" If "语句,只设置苹果。在uchar (i,j) = 0;无条件地,只有图像的左三分之一会变黑。

edit 2我相信我在原始彩色图像上使用的"split"似乎修改了原始彩色图像。我已经在循环中使用了它的副本,并得到了更多预期的结果,谢谢大家!

在特定条件为真后,将彩色图像中的像素值赋给白色。我已经把它改成了白色,你可以把255换成0把它改成黑色。下面的代码段将完成这项工作。

#include <opencvcv.h>
#include<highguihighgui.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main( ) {
Mat originalImage = imread("5.jpg", CV_LOAD_IMAGE_UNCHANGED); 
  if (originalImage.empty()){ 
    cout << "Error : Image cannot be loaded..!!" << endl;         
    return -1;
  } 
 for(int i=0;i<originalImage.rows;i++)
 {
  for(int j=0;j<originalImage.cols;j++)
  {
   if(originalImage.at<cv::Vec3b>(i,j)[0] == 0 || originalImage.at<cv::Vec3b>(i,j)[1] == 0 || originalImage.at<cv::Vec3b>(i,j)[2] == 0 )
    {
     //originalImage.at<Vec3b>(i,j) = 255;
     originalImage.at<cv::Vec3b>(i,j)[0]=255; // change it to white
     originalImage.at<cv::Vec3b>(i,j)[1]=255;
     originalImage.at<cv::Vec3b>(i,j)[2]=255;
        //   cout << i<<" " <<j<< endl; 
     }
   }
 }
 imwrite("result.png",originalImage);
namedWindow("MyWindow",CV_WINDOW_AUTOSIZE);
imshow("MyWindow", originalImage); 
waitKey(0);  
destroyWindow("MyWindow");
return 0;
 }

希望这是你需要的!!

对于3通道24位图像,您可以通过uchar访问,但每列是单个通道值,因此您必须假设通道数的3倍!或者你只是使用Vec3b来访问像素:

 for(int i=0;i<apples.rows;i++)
            {
                for(int j=0;j<apples.cols;j++)
                    {
                     // read whole pixel value, which is a Vec3b for most color images. If you only read uchars you would have to multiply column index by 3 and add the channel number (0..2)
                     cv::Vec3b & pixel = applescopy[0].at<Vec3b>(i,j)
                     // decompose the pixel to three channels
                     uchar & B = pixel[0];
                     uchar & G = pixel[1];
                     uchar & R = pixel[2];
                     // test for any condition, e.g. if one of RGB is 0
                        if( anyCondition )
                          {
     //set whole Vec3b to some value
                            apples.at<Vec3b>(i,j) = black;
                          }
                    }
            }