我正在寻找分割彩色图像以尝试和识别某些功能。如果它不符合某些决策规则,我正在设置一个像素为黑色,否则我想让像素与第一次读取时完全相同。将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我相信我在原始彩色图像上使用“分割”似乎修改了原始彩色图像。我已经做了一个副本,以便在循环中使用,并获得更多预期的结果,谢谢你们!
请发布代码,你说是跳过图像的2/3rd,所以我们可以帮助你。 – mjuarez
.at(i,j)确实访问i,j uchar值,如果您有8位灰度图像,则为i,j像素,但如果您有彩色图像,则必须使用3倍的“列”因为3个uchar值是一个RGB值。最简单的方法是使用.at (i,j)如果您有3个通道,每个通道8位。 –
Micka