wanwanqq 2015-04-07 01:12 采纳率: 0%
浏览 4944

如何在单幅图像中消去阴影

在对图像处理时,由于图像中的阴影出现,导致算法无法进行,怎样可以将单幅图像里的阴影消去

  • 写回答

1条回答 默认 最新

  • shiter 人工智能领域优质创作者 2015-04-07 01:32
    关注
     /*********************************************/
     //阴影检测
    /*********************************************/
    
    CvPoint downleft,upright;
    int cnt;
    int dir[8][2]={-1,-1,-1,0,-1,1,0,1,0,-1,1,1,1,0,1,-1};
    #define SHADOW 170
    #define Thres_KindNumber 20
    
    bool InRange(CvPoint point,IplImage* pi) 
    {
        int w=pi->width;
        int h=pi->height;
        if(point.x>=0&&point.x<w&&point.y>=0&&point.y<h)
        {
            float  v[3];
            for(i=0;i<3;i++)
            {
                v[i]=((uchar*)(pi->imageData + pi->widthStep*point.y))[point.x*3+i];
                if(v[i]<=SHADOW)
                    return true;
            }
        }
        return false;
    }
    
    void Dye(IplImage** curimg,CvPoint s)
    {
        int i;
        queue<CvPoint>Q;
        Q.push(s);
    
        for(i=0;i<3;i++)
            ((uchar*)((*curimg)->imageData + (*curimg)->widthStep*s.y))[s.x*3+i]=SHADOW+10;
    
        while(!Q.empty())
        {
            s=Q.front();
            Q.pop();
    
            if(s.x<downleft.x)  downleft.x=s.x;
            if(s.y<downleft.y)  downleft.y=s.y;
            if(s.x>upright.x)   upright.x=s.x;
            if(s.y>upright.y)   upright.y=s.y;
    
            //dye around
            for(i=0;i<8;i++)
            {
                CvPoint now=cvPoint(s.x+dir[i][0],s.y+dir[i][1]);
                if(InRange(now,*curimg))
                {
                    Q.push(now);
                    cnt++;
                    for(i=0;i<3;i++)
                        ((uchar*)((*curimg)->imageData + (*curimg)->widthStep*now.y))[now.x*3+i]=SHADOW+10;
                }
            }
        }
    }
    
    void CCVMFCView::OnShadowDetect()
    {
        //detect shadows,find the region with highest pixel value
        int x,y;
        srcimg=workImg;
        for(y=0;y<srcimg->height;y++)
            for(x=0;x<srcimg->width;x++)
            {
                CvPoint curp=cvPoint(x,y);
                downleft.x=srcimg->width;downleft.y=srcimg->height;
                upright.x=upright.y=0;
                cnt=0;
    
                if(InRange(curp,srcimg))
                    Dye(&srcimg,curp);
                if(cnt>Thres_KindNumber)
                    cvRectangle(workImg , downleft,upright,CV_RGB(0,255,0),1,CV_AA,0);
            }
            Invalidate();
    }
    

    检测好了以后去除就很方便了

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名
  • ¥65 汇编语言除法溢出问题