图像右上的黑色转白色

//使用动态地址访问颜色通道
#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;
}

此外还可以用迭代器遍历,博主不再赘述。

猜你喜欢

转载自blog.csdn.net/kyleasy/article/details/82935828