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

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

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

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

希望这就是您所需要的!!让我知道。

关于c++ - 在 OpenCV C++ 中将彩色图像中的像素 (i,j) 设置为黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32961007/

相关文章:

c++ - 生成文件: what's the name of this warning?

java - 什么是内联?

java - Android 应用程序位图的替代方案

javascript - 如何使用javascript onload 下载多个图像?

c++ - sigma_s和sigma_r的详细含义OpenCV上的Enhance函数

c++ - 查找有符号整数和无符号整数是偶数还是奇数

c++ - 编译器为内部函数生成程序集的问题

macos - 使用命令行向图像添加透明像素行

c++ - OpenCV 裁剪来自相机的实时馈送

python - 使用HoughLine变换检测角度并旋转图像