您当前的位置: 首页 >  matlab

slandarer

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

MATLAB 自动数独求解器(导入图片自动求解)

slandarer 发布时间:2020-10-15 20:48:31 ,浏览量:0

做了一个导入图片自动求解数独的软件,不过由于目前是通过最小二乘法匹配数字的,所以导入图片中的数字最好不要是手写的。。,图片大概就像这样:

使用效果:

在这里插入图片描述

在这里插入图片描述 在这里插入图片描述

完整代码:
function sudokuApp
global SDKFig SDKAxes
global LoadPicButton computeButton
global oriPic picInfor SDKPicSet
SDKPicSet={};
SDKFig=uifigure('units','pixels',...
    'position',[300 100 450 500],...
    'Numbertitle','off',...
    'menubar','none',...
    'resize','off',...
    'name','数独求解器 1.0',...
    'color',[1,1,1].*0.97);
SDKFig.AutoResizeChildren = 'off';
SDKAxes=uiaxes('Units','pixels',...
      'parent',SDKFig,...
      'PlotBoxAspectRatio',[1 1 1],...
      'Position',[15 15 420 420],...
      'Color',[0.99 0.99 0.99],...
      'Box','on', ...
      'XLim',[0 1],'YLim',[0 1],...
      'XTick',[],'YTick',[]);
SDKAxes.Toolbar.Visible='off';
LoadPicButton=uibutton(SDKFig,'Text','导  入  图  片','BackgroundColor',[0.31 0.58 0.80],'FontColor',[1 1 1],...
    'FontWeight','bold','Position',[25,450,150,35],'FontSize',13,'ButtonPushedFcn',@loadPic);  
computeButton=uibutton(SDKFig,'Text','开  始  计  算','BackgroundColor',[0.31 0.58 0.80],'FontColor',[1 1 1],...
    'FontWeight','bold','Position',[200,450,150,35],'FontSize',13,'ButtonPushedFcn',@compute); 
%============================================================================================================
init()   

    function loadPic(~,~)
        try
            [filename, pathname] = uigetfile({'*.jpg;*.tif;*.png;*.gif','All Image Files';...
                '*.*','All Files' });
            oriPic=imread([pathname,filename]);
            Lim=max(size(oriPic));
            SDKAxes.XLim=[0 Lim];
            SDKAxes.YLim=[0 Lim];
            imshow(oriPic,'parent',SDKAxes)
        catch
        end
    end

    function compute(~,~)
        bw=~im2bw(oriPic);
        deletedRange=round(((size(bw,1)+size(bw,2))/2)^2*0.00005);
        bw=bwareaopen(bw,deletedRange);
        
        xDistrib=find(sum(bw,2)~=0);
        yDistrib=find(sum(bw,1)~=0);
        xLim=[xDistrib(1),xDistrib(end)];
        yLim=[yDistrib(1),yDistrib(end)];
        reSizeEps=[round(mod((xLim(2)-xLim(1)+1),9)/2),round(mod((yLim(2)-yLim(1)+1),9)/2)];
        selectedPic=bw(xLim(1)+reSizeEps(1):xLim(2)-mod((xLim(2)-xLim(1)+1),9)+reSizeEps(1),...
            yLim(1)+reSizeEps(2):yLim(2)-mod((yLim(2)-yLim(1)+1),9)+reSizeEps(2));
        
        numPicSize=size(selectedPic)./9;
        basePosX=[xLim(1),xLim(2)];
        basePosY=[yLim(1),yLim(2)];
        hold(SDKAxes,'on')
        for i=0:9
            plot(SDKAxes,[basePosY(1),basePosY(1)]+i*numPicSize(2),[basePosX(1),basePosX(2)],'Color',[0.29 0.65 0.85],'lineWidth',2)
            plot(SDKAxes,[basePosY(1),basePosY(2)],[basePosX(1),basePosX(1)]+i*numPicSize(1),'Color',[0.29 0.65 0.85],'lineWidth',2)
        end
        
        for i=1:9
            for j=1:9
                tempPic=selectedPic((i-1)*numPicSize(1)+1:i*numPicSize(1),(j-1)*numPicSize(2)+1:j*numPicSize(2));
                tempPic=imclearborder(tempPic);
                xDistrib=find(sum(tempPic,2)~=0);
                yDistrib=find(sum(tempPic,1)~=0);
                if ~any(xDistrib)||~any(yDistrib)
                    numPic.(['Pic',num2str(i),num2str(j)])=[];
                else
                    xLim=[xDistrib(1),xDistrib(end)];
                    yLim=[yDistrib(1),yDistrib(end)];
                    tempPic=tempPic(xLim(1):xLim(2)-round(0.1*(xLim(2)-xLim(1))),yLim(1):yLim(2));
                    xDistrib=find(sum(tempPic,2)~=0);
                    yDistrib=find(sum(tempPic,1)~=0);
                    xLim=[xDistrib(1),xDistrib(end)];
                    yLim=[yDistrib(1),yDistrib(end)];
                    tempPic=tempPic(xLim(1):xLim(2),yLim(1):yLim(2));
                    
                    tempPic=imresize(tempPic,[70 40]);
                    numPic.(['Pic',num2str(i),num2str(j)])=tempPic;
                    %imwrite(tempPic,[num2str(i),num2str(j),'.jpg'])
                end
            end
        end
        
        sudokuMat=zeros(9,9);
        for i=1:9
            for j=1:9
                if ~isempty(numPic.(['Pic',num2str(i),num2str(j)]))
                    tempVarin=inf.*ones(1,size(picInfor,1));
                    for k=1:size(picInfor,1)
                        tempVarin(k)=sum(sum((double(SDKPicSet{k})-(numPic.(['Pic',num2str(i),num2str(j)])).*255).^2));
                    end
                    tempStr=picInfor(tempVarin==min(tempVarin)).name;
                    sudokuMat(i,j)=str2num(tempStr(1));
                end
            end
        end
        orisudokuMat=sudokuMat;
        sudokuMat=sodoku(sudokuMat);
        sudokuMat(orisudokuMat~=0)=0;
        fontSize=18;
        if (basePosX(2)-basePosX(1))>0.8*size(oriPic,1)
            fontSize=36;
        end
        for i=1:9
            for j=1:9
                if sudokuMat(j,i)~=0
                text(SDKAxes,basePosY(1)+(i-1)*numPicSize(2)+numPicSize(2)/2,...
                             basePosX(1)+(j-1)*numPicSize(1)+numPicSize(1)/2,...
                             num2str(sudokuMat(j,i)),'HorizontalAlignment','center',...
                             'Color',[0.29 0.65 0.85],'fontWeight','bold','fontSize',fontSize)
                end
            end
        end
        
        
    end

    function S=sodoku(M,S)
        if nargin            
关注
打赏
1664692598
查看更多评论
0.0927s