• 去掉图片中的红色标记的方法?


    https://zhidao.baidu.com/question/552568064.html 这个网页居然说是用美图秀秀弄。好歹是做过图像处理的。决定自己弄。

    其实很简单,这是处理之前的图像,带一个红圈圈:

    我希望没有那个红圈圈:

    其实图像处理算法很简单,循环判断该点是不是红色,通过RGB值的范围和R要比G/B两个都大一定的值来判断是否红色。如果是红色,采用周围邻域的平均值来替代。

    代码如下:

     1     for (int i=1;i<25;i++)
     2     {
     3         CString filename;
     4         filename.Format("%.2d.jpg",i);
     5         IplImage *image1=cvLoadImage(filename,-1);
     6         cv::Mat ming1(image1,0); 
     7         //cvNamedWindow("before",0);
     8         //cvShowImage("before",image1);
     9         int channle=ming1.channels();
    10         vector<mypoint> dian;
    11         for(int jx = 0;jx < ming1.rows;jx++)
    12         {   
    13             // 行定位
    14             uchar *data =ming1.ptr<uchar>(jx);                // 最终要得到的拼接图
    15             for (int iy=0;iy < ming1.cols;iy++)
    16          {
    17              int va1=data[iy*channle+2];
    18              int va2=data[iy*channle+1];
    19              int va3=data[iy*channle+0];
    20              if ((va1>180&&va2<70&&va3<70)||(va1-va2>50&&va1-va3>50))//红色
    21                 {
    22                     dian.clear();
    23                     for (int m=-8;m<=8;m++)//y
    24                     {
    25                         for (int n=-8; n<=8;n++)//x
    26                         {
    27                             if ((jx+m)<0||(jx+m)>ming1.rows||(iy+n)<0||(iy+n)>ming1.cols)
    28                             {
    29                                 continue;
    30                             }else
    31                             {
    32                                 uchar *ndata =ming1.ptr<uchar>(jx+m);    
    33                                 mypoint f;
    34                                 int niy=iy+n;
    35                                 f.a=ndata[niy*channle+2];
    36                                 f.b=ndata[niy*channle+1];
    37                                 f.c=ndata[niy*channle+0];
    38                                 if ((f.a>180&&f.b<70&&f.c<70)||(f.a-f.b>50&&f.a-f.c>50))//红色
    39                                 {
    40 
    41                                 }else
    42                                 {
    43                                     dian.push_back(f);
    44                                 }
    45 
    46                             }
    47                         }
    48                     }//9gedian
    49                     mypoint sum;
    50                     sum.a=0;
    51                     sum.b=0;
    52                     sum.c=0;
    53                     for (int k=0; k<dian.size();k++)
    54                     {
    55                         sum.a=sum.a+dian[k].a;
    56                         sum.b=sum.b+dian[k].b;
    57                         sum.c=sum.c+dian[k].c;
    58                     }
    59                     data[iy*channle+2]=(float)sum.a/(dian.size()*1.0);
    60                     data[iy*channle+1]=(float)sum.b/(dian.size()*1.0);
    61                     data[iy*channle+0]=(float)sum.c/(dian.size()*1.0);
    62 
    63                 }
    64 
    65             }
    66         }
    67 
    68         //cvNamedWindow("after",0);
    69         //cvShowImage("after",image1);
    70         cvSaveImage(filename,image1);
    71 
    72 
    73     }
    74      
    75 
    76     
    77 
    78 
    79 
    80 
    81      cvWaitKey(0);
    82      system("pause");
    83             return 0;
  • 相关阅读:
    几个容易混淆的集合类
    ajax操作时用于提高用户体验的两段备用代码
    word-wrap和word-break的区别
    清除MAC OS X上的流氓软件
    Windows Azure IP地址详解
    实现跨云应用——基于DNS的负载均衡
    Windows Azure虚拟机和云服务实例计费方式更新
    证明你是你——快速开启Windows Azure多重身份验证
    Windows 10 L2TP 809错误
    新版Microsoft Azure Web管理控制台
  • 原文地址:https://www.cnblogs.com/love6tao/p/6095819.html
Copyright © 2020-2023  润新知