Matlabに基づく解答用紙の画像検出と認識に関する研究

        審査は教育測定の重要な手段であり、現在の才能を選択する重要な手段でもあります。したがって、公平性と正義は非常に重要であり、それは審査の過程だけでなく、採点の過程にも反映されます。過去には、これらのテストペーパーは手動でレビューおよび修正され、ペーパーを採点した教師のレベル、状態、および気分がペーパーの結果に影響を与える可能性がありました。この不確実性は不公平で公正でした。情報技術の継続的な発展とコンピュータ機能の継続的な強化により、解答用紙用のコンピュータ採点装置が登場しました。電子スキャン技術により、紙の解答用紙が数値形式に変換され、自動的に評価されます。これは問題を解決するだけではありません。スコアリングの公平性と正確性の要件も、スコアリングの効率を向上させます。

        現在、解答カードを識別する主な方法は2つあります。1つは光電装置に基づく方法、もう1つは画像処理技術に基づく方法です。カーソルリーダー(OMR)は、さまざまな領域の感光能力を、光電装置に従ってコンピューターによって処理される電気信号に変換し、電気信号に従って認識します。この識別システムは、高効率、高精度、低消費電力というメリットがありますが、カーソルマーキングマシンと専用アンサーカードを使用する必要があり、購入コストと使用コストが非常に高いというデメリットもあります。高く、こういう解答用紙のフォーマットが決まれば、修正が難しく、適用範囲も狭い。画像処理技術は、画像取得装置によって取得された画像をコンピュータの分析および識別に使用して、解答用紙上の効果的な情報を取得することです。この識別方法は、マーキング作業を完了するだけでなく、低コストで使い勝手が良いという利点があり、解答用紙の構造をソフトウェアで簡単に変更して、さまざまなニーズに適合させることができます。

需要分析

  1. 解答用紙の解答オプションを特定する
  2. 正解と比較する
  3. スコアを特定して計算する
  4. 結果をExcelファイルに書き込みます
  5. ほぼ100%の認識率

この論文は実現します 

  • 前処理-グレースケール、2値化など。
  • 傾き補正-ハフ変換
  • 歪み補正-コーナー検出、投影変換
  • 誤認識率が低く、充填トレースの正確な位置決め
  • 対象の検出結果を標準回答と比較し、分析結果を示します。

コード

img_path_list = dir(strcat(file_path,'*.jpg'));%获取该文件夹中所有jpg格式的图像  
img_num = length(img_path_list);%获取图像总数量 
errno = 0;%错误代码,0表示无误
if img_num > 0 %有图像
    for k = 1:img_num %逐一读取图像  
        image_name = img_path_list(k).name;% 图像名  
        image =  imread(strcat(file_path,image_name));  
        %I{j}=image;
        fprintf('%s\n',strcat(file_path,image_name));
        
       %% 识别过程
        %预处理
        SHOW=1;
        if numel(image)>2
          gray=rgb2gray(image);%用灰度化函数灰度化
            %自定义灰度化,由于红色的干扰比较大,因此降低红色通道的比重
            R = image(:,:,1);  %通道R
            G = image(:,:,2);  %通道G
            B = image(:,:,3);  %通道B
            gray = (G.*0.45 + B.*0.45 + R.*0.10);%降低R通道权重
        else
            gray=image;
        end
        %滤波与二值化
        g_bw = imbinarize(gray).*1.0;
        Low_High = stretchlim(g_bw, [0.0 0.3]);
        enmed= imadjust(g_bw, Low_High, [ ]);%对比度增强
        med = medfilt2(enmed, [7 5]);%中值滤波
        gausFilter = fspecial('gaussian',[5 5],10);   %高斯滤波器
        blur=imfilter(med,gausFilter,'replicate'); %高斯滤波
        
        bw = imbinarize(blur, max(0.2,graythresh(blur)-0.2));%im2bw
        if SHOW
            figure(),subplot(121),imshow(image);title('原图');
            subplot(122),imshow(gray);title('灰度图');
            figure('name','预处理过程');
            subplot(2, 2, 1);imshow(enmed);title('对比度增强');
            subplot(2, 2, 2);imshow(med);title('中值滤波');
            subplot(2, 2, 3), imshow(blur), title('高斯平滑');
            subplot(2, 2, 4), imshow(bw), title('二值化');
        end
        %% 定位感兴趣区域
        SHOW=1;
        e_in=bw;
        e_in_gray=gray;
        edged_img=edge(e_in,'canny');%边缘检测
        S1 = regionprops(edged_img,'BoundingBox','PixelIdxList');
        max_area = 0;
        for i = 1:length(S1)%寻找最大BoundingBox
            area = S1(i).BoundingBox(3)*S1(i).BoundingBox(4); 
            if area>max_area
               max_area = area;
               pos = i;
            end
        end
        bbox = round(S1(pos).BoundingBox);
        bbox(3:4)=bbox(3:4) + 1;
        e_in_new(S1(pos).PixelIdxList)=1;
        CNT_ROI=e_in_new(bbox(2):bbox(2)+bbox(4)-1,bbox(1):bbox(1)+bbox(3)-1);
        if SHOW
            figure('name','边缘检测'),imshow(edged_img);
            figure('name','ROI');
            subplot(1,2,1);
            imshow(ROIofbw);title('感兴趣区域二值图');
            subplot(1,2,2);imshow(CNT_ROI);title('感兴趣区域轮廓');
            imwrite(CNT_ROI,'./refer/CNT_ROI.jpg');
        end
        %% 倾斜校正 使用hough直线检测
        SHOW = 1;%控制是否显示中间过程
        %输入参数
        ROIofBW = ROIofbw;
        [H,Theta,Rho] = hough(CNT_ROI);
        [hight,width]=size(CNT_ROI);
        if length(lines)==1
            rotate_angle=lines.theta;%求旋转角
        else
            rotate_angle=lines(pos).theta;%求旋转角
        end
        rotated_ROIofBW = imrotate(ROIofBW,rotate_angle);
        rotated_ROI_ORI = imrotate(ROI_ORI,rotate_angle);%####ORI
        rotated_CNT_ROI = imrotate(CNT_ROI,rotate_angle);
        if SHOW
            figure,subplot(121),imshow(ROIofBW);title('倾斜校正前');
            hold on
            xy = [lines(pos).point1; lines(pos).point2];
            plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','r');
            hold off;
            subplot(122),imshow(rotated_ROIofBW);title('倾斜校正后');
            imwrite(rotated_ROIofBW,'refer/rotated_ROIofBW.jpg')
        end
end

 

 詳細なコードおよびその他の情報については、次をクリックしてください:134-170-3358;

おすすめ

転載: blog.csdn.net/Jiangtagong/article/details/123686332