不学习OpenCV 修改图形指定区域的像素

    要求修改一张图片的矩形区域和圆形区域的像素值。


    矩形区域没什么难度,主要是圆形区域。我们使用Circle构建一个图层蒙版,然后在复制原图对应区域的内容到dest,然后修改dest中修改圆形区域的像素值,最后将dest内容复制回去即可。

#include <opencv.hpp>
#include <iostream>

int main(int argc, char** argv)
{
    cv::Mat img = cv::imread("C:\\Users\\96921\\OneDrive\\Pictures\\Camera Roll\\001.jpg", -1);
    //四通道读取图片

    int imgHeight = img.size().height;
    int imgWidth = img.size().width;
    std::cout << img.size() << std::endl;
    //获取宽高

    //----- Rectangle -----//
    for (int i(0); i < imgHeight / 2; ++i)
    {
        for (int j(0); j < imgWidth / 2; ++j)
        {
            float Red = img.at<cv::Vec3b>(i, j)[0];
            float Green = img.at<cv::Vec3b>(i, j)[1];
            float Blue = img.at<cv::Vec3b>(i, j)[2];

            Red *= 1.2;
            Green *= 1.2;
            Blue *= 1.2;

            Red > 255 ? Red = 255 : Red;
            Green > 255 ? Green = 255 : Green;
            Blue > 255 ? Blue = 255 : Blue;

            img.at<cv::Vec3b>(i, j)[0] = Red;
            img.at<cv::Vec3b>(i, j)[1] = Green;
            img.at<cv::Vec3b>(i, j)[2] = Blue;
        }
    }

    //----- Circle -----//
    cv::Mat dest = cv::Mat::zeros(img.size(), img.type());
    cv::Mat mask = cv::Mat::zeros(img.size(), CV_8U);
    cv::circle(mask, cv::Point(imgWidth / 2, imgHeight / 2), 50, cv::Scalar(255), -1);
    //dest为处理中转,mask为面罩(类似于PS的图层蒙版)

    img.copyTo(dest, mask);
    //把img中的mask部分拷贝到dest中

    for (cv::MatIterator_<cv::Vec3b> it = dest.begin<cv::Vec3b>(); it != dest.end<cv::Vec3b>(); ++it)
    {
        (*it)[0] = (*it)[0] * 0.8;
        (*it)[1] = (*it)[1] * 0.8;
        (*it)[2] = (*it)[2] * 0.8;
    }
    dest.copyTo(img, mask);
    //处理dest中的图形,再拷贝回去

    cv::namedWindow("Example", cv::WINDOW_AUTOSIZE);
    cv::imshow("Example", img);
    cv::waitKey(0);
   
    return 0;
}