书籍翻拍展平方案

  • 畸变校正基本原理
    • 畸变校正的关键在于确定基点和畸变方程
    • 基点:书本畸变是水平方向的畸变,以书本中间的分界线为基点
    • 畸变方程:用书本的边界线来确定
  • 书籍翻拍特征分析
    • 书本的颜色信息有各种各样的,会影响二值化信息
    • 书本厚薄会影响边界分界点的表现形式
      • 厚书两边会有梯度
      • 薄书中间位置会有最大最小值或是平行直线
    • 书本的摆放角度会影响最终的表达式
  • 执行方案流程
    •   
  • 代码实现
    1. 获取图像并灰度化
      %read image to cache
      imgSrc=imread('G:\01_work_project\06book_image\01source\厚薄\PIC_0005_Left.jpg');
      %grayscale image with Max(R,G,B)
      [srcrow srccol]=size(imgSrc);
      for i=1:srcrow
          for j=1:srccol/3
              imgGray(i,j)=max(imgSrc(i,j,1),max(imgSrc(i,j,2),imgSrc(i,j,3)));
          end
      end
      imwrite(imgGray,'E:\01灰度图.jpg');
      figure(2);subplot(111);imshow(imgGray);title('灰度图');
      

        

    2. 二值化
      %二值化
      thresh=30/255;
      imgbw=im2bw(imgGray,thresh);
      imgbw=medfilt2(imgbw,[7 7]);
      imwrite(imgbw,'E:\02二值图.jpg');figure(3);subplot(111);imshow(imgbw);title('二值图');
      

        

    3. 边缘检测
      imgEdge=edge(imgbw,'canny');
      imwrite(imgEdge,'E:\03canny边缘检测.jpg');figure(4);subplot(111);imshow(imgEdge);title('canny算子边缘检测');
      imgsmalledeg=bwmorph(imgEdge,'thin',Inf);
      imwrite(imgsmalledeg,'E:\04骨架.jpg');figure(5);subplot(111);imshow(imgsmalledeg);title('imgsmalledeg');
      

        

    4. 确界曲线
      [row col]=size(imgsmalledeg);
      imgconfine=zeros(row,col);
      ytop(col)=0;
      ybot(col)=0;
      for j=20:col-20
      	for i=20:row/4
      		if imgsmalledeg(i,j)==1
      			imgconfine(i,j)=255;
      			ytop(j)=i;
      			break;
      		end
      	end
      	for i=row-20:-1:row/4*3
      		if imgsmalledeg(i,j)==1
      			imgconfine(i,j)=255;
      			ybot(j)=i;
      			break;
      		end
      	end
      end
      imwrite(imgconfine,'E:\05结构点.jpg');figure(5);subplot(111);imshow(imgconfine);title('imgconfine');
      

        

    5. 寻找中间分界线

      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      %寻找右角点
      %求出数值统计信息——————1.平均值2.变化率3.变化绝对值4.
      top_dvalue(col-500)=0;
      top_mvalue(col-500)=0;
      top_ratevalue(col-500)=0;
      bot_ratevalue(col-500)=0;
      top_5poing(col-500)=0;
      for i=col-25:-1:col-500
        top_mvalue(i)=(ytop(i)+ytop(i-1)+ytop(i-2)+ytop(i+1)+ytop(i+2))/5;
        top_ratevalue(i)=abs((ytop(i+5)-ytop(i))-(ytop(i)-ytop(i-5)));
        bot_ratevalue(i)=abs((ybot(i+5)-ybot(i))-(ybot(i)-ybot(i-5)));
        top_5poing(i)=ytop(i)-ytop(i-5);
      end
      for i=col-25:-1:col-500
       top_dvalue(i)=ytop(i)-top_mvalue(i);
      end
      figure(7);subplot(221),bar(top_mvalue);
      figure(7);subplot(222),bar(top_5poing);
      figure(7);subplot(223),bar(top_ratevalue);
      figure(7);subplot(224),bar(top_dvalue);
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      Maxratetop=0;
      Maxratebot=0;
      for i=col-25:-1:col-500
       if top_ratevalue(i)>Maxratetop
        Maxratetop=top_ratevalue(i);
        Mattateitop=i;
       end
       if bot_ratevalue(i)>Maxratebot
        Maxratebot=bot_ratevalue(i);
        Mattateibot=i;
       end
      end

      imgright=imgconfine;
      for j=1:col
       for i=1:row
        if j==Mattateitop
         imgright(i,j)=255;
        end
        if j==Mattateibot
         imgright(i,j)=64;
        end
       end
      end
      imwrite(imgright,'E:\06右上点.jpg');
      figure(8);subplot(111);imshow(imgright);title('imgright');
      %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

        

  • 测试调整

posted on 2016-10-09 10:03  xiaochenxi_cnblogs  阅读(1242)  评论(0编辑  收藏  举报

导航