隨筆 - 67  文章 - 79  trackbacks - 0
          <2008年12月>
          30123456
          78910111213
          14151617181920
          21222324252627
          28293031123
          45678910

          常用鏈接

          留言簿(1)

          隨筆檔案

          文章檔案

          相冊(cè)

          搜索

          •  

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          問(wèn)題是這樣的,有一組扇形位圖,求其中每一個(gè)扇形的圓心,半徑,圓心角
          位圖類似以下:這是一副一般掃描儀輸出的結(jié)果

          首先是opencv 能幫我們做得,提取圖像邊緣 效果如圖:
          void getEdge(const IplImage* pImg,IplImage* pCannyImg,int pos){

              IplImage
          * pGray = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
              cvCvtColor(pImg,pGray,CV_BGR2GRAY);

              cvSmooth(pGray,pCannyImg,CV_BLUR,
          3,3,0,0);
              cvNot(pGray,pCannyImg);
              cvCanny(pGray,pCannyImg,pos,pos
          *3,3);
              cvRelease(
          &pGray);
          }



          然后就要對(duì)邊緣分割來(lái)得到一個(gè)個(gè)扇形,因?yàn)檫@些扇形都是整齊排列的,所以不需要什么封閉軌跡檢查,直接根據(jù)點(diǎn)的坐標(biāo)的連續(xù)性就可以判定了。不妨設(shè)橫豎相差大于3個(gè)像素點(diǎn)為不同扇形的點(diǎn)。
           const int hgap=3;
              
          const int vgap=3;
              
          for(int row=0;row<edge->height;++row){
                  
          for(int col=0;col<edge->width;++col){
                      
          const uchar* value=(const uchar*)edge->imageData+row*edge->widthStep+col;

                      
          if*value == 255){
                          
          // printf("%d,%d = %d\n",row,col,*value);
                          points.push_back(std::make_pair(col,row));
                      }
                  }
              }
              Points::const_iterator iter;
              Point prev
          =std::make_pair(0,0);

              
          for(iter=points.begin();iter!=points.end();++iter){
                  
          if(iter->second-prev.second > vgap){
                      Area area;
                      areas.push_front(area);
                  }
                  areas[
          0].push_back(*iter);
                  prev
          =*iter;
              }

              prev
          =std::make_pair(0,0);
              
          for(Areas::iterator iter= areas.begin();iter!=areas.end();++iter){
                  std::sort(iter
          ->begin(),iter->end());
                  
          for(Area::const_iterator iter2=iter->begin();iter2!=iter->end();++iter2){
                      
          if((iter2->first-prev.first>hgap) || (iter2->first-prev.first<0)){
                          Area area;
                          result.push_front(area);
                      }
                      result[
          0].push_back(*iter2);
                      prev
          =*iter2;
                  }
              }

          這樣我們就得到了一組扇形的邊緣軌跡。因?yàn)檫@些軌跡是無(wú)序排列的,所以我們需要求出這個(gè)扇形的邊緣鏈碼,才能對(duì)軌跡進(jìn)行分析。
          又由于掃描得到的圖片有明顯失真,所以用一般的8領(lǐng)域并不能準(zhǔn)確得到鏈碼,我們需要更大的領(lǐng)域矩陣。
          求N階領(lǐng)域函數(shù):
          Points getNearPoints(const Point& point,int gap=1){
              std::set
          <Point> s_points;
              Points          points;
              
          int x(point.first),y(point.second);
              
          for(int i=gap;i>=-gap;--i){
                  
          for(int j=gap;j>=-gap;--j){
                       s_points.insert(std::make_pair(x
          +i,y+j));
                  }
              }

              
          for(std::set<Point>::const_iterator iter = s_points.begin();iter!=s_points.end();++iter){
                  
          if(*iter!=point)
                      points.push_back(
          *iter);
              }

              
          return points;
          }
          這里有一點(diǎn)算法優(yōu)化,因?yàn)榭梢员WC:扇形2條半徑中右邊的一條必定斜率為0,所以求出右邊半徑的2個(gè)斷點(diǎn)很簡(jiǎn)單。因?yàn)樾甭蕿?,即此區(qū)間上的微分為0,也即差分為0。所以半徑的右斷點(diǎn)和圓心為軌跡上最長(zhǎng)的差分為0區(qū)間的2個(gè)端點(diǎn)。
          有了圓心點(diǎn),再根據(jù)鏈碼 向下尋找,得到左邊半徑的軌跡:

          由于直線的二階導(dǎo)數(shù)為0 左端點(diǎn)即為以上軌跡中二階差分為0的最長(zhǎng)區(qū)間的左端點(diǎn)
          有了2條半徑的端點(diǎn),不難求得此扇形的圓心角。

          由于圓形角代表了每一個(gè)扇形紅色的分度值,所以可以將原圖修復(fù)如下:


          posted on 2008-11-28 15:27 zarra 閱讀(389) 評(píng)論(1)  編輯  收藏

          FeedBack:
          # re: 對(duì)于給定離散軌跡 擬合其中存在的直線方程的分析[未登錄](méi) 2008-12-02 15:10 apple
          好崇拜~~~~~~
          差分求導(dǎo)又是怎么弄的??您搞的東西越來(lái)越深?yuàn)W,越來(lái)越不懂!!!  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 高陵县| 湘西| 泰来县| 安仁县| 安阳市| 锡林郭勒盟| 娱乐| 峨眉山市| 蓬莱市| 宕昌县| 永和县| 新宁县| 湾仔区| 寿宁县| 治县。| 城步| 买车| 黄大仙区| 乳源| 内丘县| 常山县| 营口市| 额济纳旗| 建平县| 托克托县| 东山县| 福清市| 晋中市| 阿克苏市| 广西| 崇州市| 安义县| 沈阳市| 秦安县| 安阳市| 平遥县| 泸溪县| 祁门县| 沾益县| 利川市| 且末县|