在opencvc++中设置彩色图像中的像素(i,j)为黑色
Setting Pixel (i,j) in Color Image to Black in OpenCV C++
我正在寻找分割彩色图像,以便尝试识别某些特征。我希望设置一个像素为黑色,如果它不满足一些决策规则,否则我想让像素与第一次读取时完全相同。
我正在阅读的图像使用:
Mat apples = imread("C:/Users.......", CV_LOAD_IMAGE_COLOR);
到目前为止,我的尝试是将第i行和第j列的像素设置为黑色:
apples.at<uchar>(i,j) = 0;
当循环遍历图像的所有行和列时,它似乎跳过了图像的三分之二。
我也试过了:
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 "语句,只设置苹果。在uchar (i,j) = 0;无条件地,只有图像的左三分之一会变黑。
edit 2我相信我在原始彩色图像上使用的"split"似乎修改了原始彩色图像。我已经在循环中使用了它的副本,并得到了更多预期的结果,谢谢大家!
在特定条件为真后,将彩色图像中的像素值赋给白色。我已经把它改成了白色,你可以把255换成0把它改成黑色。下面的代码段将完成这项工作。
#include <opencvcv.h>
#include<highguihighgui.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;
}
希望这是你需要的!!
对于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;
}
}
}
相关文章:
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在C++中使用GDAL可以将图像的像素坐标转换为lat,long吗
- 如何在24位SDL_Surface上设置像素的颜色
- 如何从SDL_Surface获取特定像素的颜色
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 在C++中查找像素 RGB 数据的最快方法是什么?
- 是否可以从 OpenGL 缓冲区获取原始大小的像素?
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 如何使用 sdl2 快速绘制像素网格?
- 在 OpenCV 和 C++ 中查找距轮廓中心最近的黑色像素
- GDI+:如何将黑色像素替换为红色像素
- 如何查找黑色像素位置
- 从HWND获取并保存位图(每个像素8,4,1位-黑色图像)
- C/C++LIBTIFF:需要从BW TIFF文件中读取白色和黑色像素的像素位置
- 使用OpenCV计算黑色像素
- 如果新图像中的原始像素为黑色,则Qt绘制一个蓝色像素
- 在opencvc++中设置彩色图像中的像素(i,j)为黑色
- 渲染到纹理,读取像素的结果大部分是黑色的
- 如何确定 OpenCV 中的像素是黑色还是白色
- 最右边的黑色像素