2015-10-06 260 views
0

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

我读使用图像:

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

如果我消除了“如果”的声明秒结束,只是设置apples.at UCHAR(我, j)= 0;无条件地,只有图像的左三分之一会变黑。

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

+0

请发布代码,你说是跳过图像的2/3rd,所以我们可以帮助你。 – mjuarez

+0

.at (i,j)确实访问i,j uchar值,如果您有8位灰度图像,则为i,j像素,但如果您有彩色图像,则必须使用3倍的“列”因为3个uchar值是一个RGB值。最简单的方法是使用.at (i,j)如果您有3个通道,每个通道8位。 – Micka

回答

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

对于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; 
          } 
        } 
      } 
相关问题