我正在寻找分割彩色图像以尝试识别某些功能。如果它不符合某个决策规则,我想将像素设置为黑色,否则我想让像素与第一次读取时完全相同。
我正在使用以下方式阅读图片:
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 我相信我在原始彩色图像上使用“分割”似乎会修改原始彩色图像。我已经制作了它的副本用于循环,并获得更多预期的结果,谢谢你们!
答案 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