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

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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?