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

时间:2015-10-06 02:58:47

标签: c++ image opencv

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

我正在使用以下方式阅读图片:

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

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

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

当循环遍历图像的所有行和列时,似乎跳过了图像的2/3。

我也试过了:

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

如果我在第二个结束时删除了“if”语句,只需设置apples.at uchar(i,j)= 0;无条件地,只有图像的左三分之一会变黑。

编辑2 我相信我在原始彩色图像上使用“分割”似乎会修改原始彩色图像。我已经制作了它的副本用于循环,并获得更多预期的结果,谢谢你们!

2 个答案:

答案 0 :(得分:2)

在某些条件为真后,在彩色图像中将像素值指定为白色。我已将其更改为白色,您可以通过将255替换为0将其设置为黑色。下面的代码将完成工作。

#include <opencv\cv.h>
#include<highgui\highgui.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;
 }

希望这是你需要的!让我知道。

答案 1 :(得分:1)

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

http