基于Matlab答题卡图像检测识别研究

        考试是教育测量的重要手段,也是目前选拔人才 的重要手段。所以公平、公正就显得非常重要,这不仅 体现在考试的过程中,还体现在评卷的过程中。以前, 这些试卷都是进行人工翻阅批改,其中评卷老师的水 平、状态、情绪都能影响评卷的结果,这种不确定性有 失公平公正。随着信息技术的不断发展,计算机功能 的不断强大,出现了答题卡的计算机阅卷设备,通过电 子扫描技术将纸质的答题卡转化为数值化的形式,再 对其自动评阅,这不仅解决了评卷公正性、准确性的要 求还提高了评卷的工作效率。

        目前答题卡识别方式主要有两种:一种是基于光 电设备,另一种是基于图像处理技术。光标阅读机 (OMR)是根据光电设备将不同区域的感光能力转换 为计算机处理的电信号,再依据电信号来识别。这种 识别系统具有高效率、高准确率、低功耗的优点,但它 的缺点也很突出,即必须采用光标阅卷机和专用的答 题卡,购买成本和使用成本都非常高昂,且这种形式的 答题卡规格一旦确定就难以修改,所适用的范围小。 图像处理技术是将图像采集设备所获得的图像供计算机分析识别,从而获取答题卡上的有效信息。这种识 别方式不仅可以完成阅卷工作,还具有成本低廉、使用 方便的优点,而且可通过软件方便修改答题卡的结构, 以适应不同的需求。

需求分析

  1. 识别答题卡答案选项
  2. 与正确答案对照
  3. 判别并计算分数
  4. 将结果写入Excel文件
  5. 接近100%识别率

本文实现 

  • 预处理——灰度化,二值化等
  • 倾斜校正——hough变换
  • 畸变校正——角点检测,投影变换
  • 较低误识别率,准确定位填涂痕迹
  • 目标检测结果与标准答案进行对比,给出分析结果

代码实现

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