//使用动态地址访问颜色通道
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc,char** argv)
{
int pixel = 0;
Mat inImage ;
Mat outImage;
inImage = imread("Youraddress//black.jpg");
outImage = inImage.clone();
for(int i= 0;i<inImage.rows/2;++i)
{
for (int j = inImage.cols/2; j < inImage.cols; ++j)
{
for (int ch = 0; ch < 3; ++ch)
{
pixel+= inImage.at<Vec3b>(i,j)[ch];
}
if (pixel < 65)
{
for (int ch = 0; ch < 3; ++ch)
{
outImage.at<Vec3b>(i,j)[ch] = 255;
}
}
pixel = 0;
}
}
namedWindow("before",WINDOW_NORMAL);
namedWindow("after",WINDOW_NORMAL);
imshow("before",inImage);
imshow("after",outImage);
waitKey(0);
return 0;
}
我们要注意黑色不一定三通道的值均为0而是都接近于0,博主利用三通道值求和来判断,可能有些实用主义,在颜色复杂的情况下可以用三通道的值均小于某一阈值来判断。
//2.建立感兴趣的区域采用指针遍历
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat dst = imread("Youraddress//black.jpg");
Mat src=dst.clone();
Mat imageROI = dst(Range(0, dst.rows / 2),Range(dst.cols / 2, dst.cols));
int colsNum = imageROI.cols*imageROI.channels();
int rowsNum = imageROI.rows;
uchar* data=NULL;
for (int i = 0; i < rowsNum; i++)
{
data = imageROI.ptr<uchar>(i);
for (int j = 0; j < colsNum; j += 3)
{
if (data[j] < 20 && data[j + 1] < 20 && data[j + 2] < 20)
{
data[j] = 255;
data[j + 1] = 255;
data[j + 2] = 255;
}
}
}
namedWindow("before",WINDOW_NORMAL);
namedWindow("after",WINDOW_NORMAL);
imshow("before",src);
imshow("after",dst);
waitKey(0);
return 0;
}
此外还可以用迭代器遍历,博主不再赘述。