Image 用c语言中的opencv改变图片颜色

Image 用c语言中的opencv改变图片颜色,image,opencv,colors,Image,Opencv,Colors,我正试图写一个C程序,改变图片的颜色,然后保存它。它也可以分别对多种颜色执行此操作。例如,我的图片有红色、蓝色、紫色和绿色。程序应将除红色外的所有颜色更改为黑色并保存图片。与原始图片相比,它应该将颜色更改为除蓝色以外的黑色,并保存另一张图片。而不是把紫色和绿色分开。在保存文件之前,图片将显示在窗口中 这是我的密码: #include <iostream> #include <iostream> #include <iostream> #include <

我正试图写一个C程序,改变图片的颜色,然后保存它。它也可以分别对多种颜色执行此操作。例如,我的图片有红色、蓝色、紫色和绿色。程序应将除红色外的所有颜色更改为黑色并保存图片。与原始图片相比,它应该将颜色更改为除蓝色以外的黑色,并保存另一张图片。而不是把紫色和绿色分开。在保存文件之前,图片将显示在窗口中

这是我的密码:

#include <iostream>
#include <iostream>
#include <iostream>
#include <vector>
#include<time.h>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main(int argc, char **argv)
{

//Files' name and windows' name
char *resim[3] = {"112.png", "116.png", "113.png"};

//b,g,r values; 1-Min, 2-Max, 3-Wil be
int imgB1[] ={150, 190, 0};
int imgB2[] ={220 ,255, 80};
int imgB3[] ={168,190, 66};
int imgG1[] ={100,180, 90};
int imgG2[] ={150,255, 150};
int imgG3[] ={119, 200, 136};
int imgR1[] ={150, 0, 200};
int imgR2[] ={235, 204, 250};
int imgR3[] ={103, 25, 250};

for (int m =0; m<3; m++){

cv::Mat img = cv::imread("62.png",0);

for(int i = 0; i < img.rows; ++i) {

    for(int j = 0; j < img.cols; ++j) {

        int b=int(img.at<cv::Vec3b>(i,j)[0]);
        int g=int(img.at<cv::Vec3b>(i,j)[1]);
        int r=int(img.at<cv::Vec3b>(i,j)[2]);

        int degis=0;

        if(b >= imgB1[m] && b < imgB2[m] && g >= imgG1[m] && g <imgG2[m] && r >= imgR1[m] && r < imgR2[m])
        {
                        img.at<cv::Vec3b>(i,j)[0] = imgB3[m];                            
                        img.at<cv::Vec3b>(i,j)[1] = imgG3[m];                   
                        img.at<cv::Vec3b>(i,j)[2] = imgR3[m];    
        }
        else{
                        img.at<cv::Vec3b>(i,j)[0] = 0;                            
                        img.at<cv::Vec3b>(i,j)[1] = 0;                   
                        img.at<cv::Vec3b>(i,j)[2] = 0;
        }

    }

}


cv::namedWindow(resim[m]);
imshow(resim[m],img);
cv::waitKey(0);
imwrite(resim[m], img);
}

return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
//文件名和窗口名
char*resim[3]={“112.png”、“116.png”、“113.png”};
//b、 g,r值;1分钟,2分钟,3分钟
int imgB1[]={150,190,0};
int imgB2[]={220,255,80};
int imgB3[]={168190,66};
int imgG1[]={100180,90};
int imgG2[]={150255,150};
int imgG3[]={119200136};
int imgR1[]={150,0200};
int imgR2[]={235,204,250};
int imgR3[]={103,25,250};
对于(int m=0;m=imgB1[m]&b=imgG1[m]&g=imgR1[m]&r
程序停止。黑色窗口中只有“程序已停止”消息。我找不到任何解决办法。

@berak 我不熟悉opencv。我不知道在什么地方

我用inrange重写代码。现在它起作用了。稍后我会重新安排,但如果有人需要示例,我会与大家分享

#include <iostream>
#include <iostream>
#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/contrib/contrib.hpp"

using namespace std;
using namespace cv;
int main()
{

    Mat src =imread("atlas40.png", CV_LOAD_IMAGE_COLOR);
    Mat mask,mask2,mask3,mask4,mask5,mask6,mask7;

    // Min values
    int blueMin =190; 
    int greenMin=180;
    int redMin =0;
    //  Max values
    int blueMax =255; 
    int greenMax=255;
    int redMax =204;


    int blueMin2=0;
    int greenMin2=128;
    int redMin2=0;
    int blueMax2=0;
    int greenMax2=255;
    int redMax2=191;
    int blueMin3=0;
    int greenMin3=8;
    int redMin3=175;
    int blueMax3=92;
    int greenMax3=86;
    int redMax3=205;
    int blueMin4=0;
    int greenMin4=90;
    int redMin4=200;
    int blueMax4=80;
    int greenMax4=150;
    int redMax4=255;
    int blueMin5=190;
    int greenMin5=90;
    int redMin5=230;
    int blueMax5=220;
    int greenMax5=150;
    int redMax5=255;
    int blueMin6=50;
    int greenMin6=0;
    int redMin6=50;
    int blueMax6=255;
    int greenMax6=0;
    int redMax6=255;
    int blueMin7=0;
    int greenMin7=200;
    int redMin7=200;
    int blueMax7=180;
    int greenMax7=255;
    int redMax7=255;

    inRange(src, Scalar(blueMin, greenMin, redMin), Scalar(blueMax, greenMax, redMax), mask);
    inRange(src, Scalar(blueMin2, greenMin2, redMin2), Scalar(blueMax2, greenMax2, redMax2), mask2);
    inRange(src, Scalar(blueMin3, greenMin3, redMin3), Scalar(blueMax3, greenMax3, redMax3), mask3);
    inRange(src, Scalar(blueMin4, greenMin4, redMin4), Scalar(blueMax4, greenMax4, redMax4), mask4);
    inRange(src, Scalar(blueMin5, greenMin5, redMin5), Scalar(blueMax5, greenMax5, redMax5), mask5);
    inRange(src, Scalar(blueMin6, greenMin6, redMin6), Scalar(blueMax6, greenMax6, redMax6), mask6);
    inRange(src, Scalar(blueMin7, greenMin7, redMin7), Scalar(blueMax7, greenMax7, redMax7), mask7);

    imshow("Color 1",mask);
    imshow("Color 2",mask2);
    imshow("Color 3",mask3);
    imshow("Color 4",mask4);
    imshow("Color 5",mask5);
    imshow("Color 6",mask6);
    imshow("Color 7",mask7);

    int k = waitKey();

    imwrite("401.png",mask);
    imwrite("402.png",mask2);
    imwrite("403.png",mask3);
    imwrite("404.png",mask4);
    imwrite("405.png",mask5);
    imwrite("406.png",mask6);
    imwrite("407.png",mask7);

    return 0;
}
#包括
#包括
#包括
#包括“opencv2/highgui/highgui.hpp”
#包括“opencv2/imgproc/imgproc.hpp”
#包括“opencv2/contrib/contrib.hpp”
使用名称空间std;
使用名称空间cv;
int main()
{
Mat src=imread(“atlas40.png”,CV\u LOAD\u IMAGE\u COLOR);
Mat掩模,mask2,mask3,mask4,mask5,mask6,mask7;
//最小值
int-blueMin=190;
int greenMin=180;
int redMin=0;
//最大值
int blueMax=255;
int greenMax=255;
int redMax=204;
int-blueMin2=0;
int greenMin2=128;
int redMin2=0;
int blueMax2=0;
int greenMax2=255;
int redMax2=191;
int-blueMin3=0;
int greenMin3=8;
int redMin3=175;
int blueMax3=92;
int greenMax3=86;
int redMax3=205;
int-blueMin4=0;
int greenMin4=90;
int redMin4=200;
int blueMax4=80;
int greenMax4=150;
int redMax4=255;
int-blueMin5=190;
int greenMin5=90;
int redMin5=230;
int blueMax5=220;
int greenMax5=150;
int redMax5=255;
int-blueMin6=50;
int greenMin6=0;
int redMin6=50;
int blueMax6=255;
int greenMax6=0;
int redMax6=255;
int-blueMin7=0;
int greenMin7=200;
int redMin7=200;
int blueMax7=180;
int greenMax7=255;
int redMax7=255;
inRange(src,标量(蓝色最小值,绿色最小值,红色最小值),标量(蓝色最大值,绿色最大值,红色最大值),掩码);
在范围(src,标量(blueMin2,greenMin2,redMin2),标量(blueMax2,greenMax2,redMax2),mask2);
在范围(src,标量(blueMin3,greenMin3,redMin3),标量(blueMax3,greenMax3,redMax3),mask3);
在范围(src,标量(blueMin4,greenMin4,redMin4),标量(blueMax4,greenMax4,redMax4),mask4);
在范围(src,标量(blueMin5,greenMin5,redMin5),标量(blueMax5,greenMax5,redMax5),mask5);
在范围(src,标量(blueMin6,greenMin6,redMin6),标量(blueMax6,greenMax6,redMax6),mask6);
在范围(src,标量(blueMin7,greenMin7,redMin7),标量(blueMax7,greenMax7,redMax7),mask7);
imshow(“颜色1”,遮罩);
imshow(“颜色2”,mask2);
imshow(“颜色3”,mask3);
imshow(“颜色4”,mask4);
imshow(“颜色5”,mask5);
imshow(“颜色6”,mask6);
imshow(“颜色7”,mask7);
int k=waitKey();
imwrite(“401.png”,掩码);
imwrite(“402.png”,mask2);
imwrite(“403.png”,mask3);
imwrite(“404.png”,mask4);
imwrite(“405.png”,mask5);
imwrite(“406.png”,mask6);
imwrite(“407.png”,mask7);
返回0;
}

感谢您的帮助。

为什么您要尝试重新设计cv::inRange(),只会更糟?