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<2
S=zeros([size(M),0]);
end
firstId=find(M(:)==0,1);
if isempty(firstId)
S(:,:,size(S,3)+1)=M;
else
[i,j]=ind2sub([9,9],firstId);
for k=1:9
ii=(ceil(i/3)-1)*3+1;
jj=(ceil(j/3)-1)*3+1;
mm=M(ii:ii+2,jj:jj+2);
if sum(M(i,:)==k)+sum(M(:,j)==k)+sum(mm(:)==k)==0
M(i,j)=k;
S=sodoku(M,S);
end
end
end
end
function init(~,~)
path='数字图像库';
picInfor=dir(fullfile(path,'*.jpg'));
for i=1:size(picInfor,1)
tempPic=imread([path,'\',picInfor(i).name]);
SDKPicSet(i)={tempPic};
end
end
end
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
数独.rar (29个子文件)
数独
t017cd4613bdd3ee916.jpg 25KB
1328639133_uMnnSf.jpg 26KB
未标题-1.png 28KB
t01ed2278e50c17a265.jpg 23KB
Img361573207.jpg 59KB
t010042d42d6eebe427.jpg 27KB
Img365650027.jpg 59KB
1384627389_GRAkTc.jpg 22KB
Img422549104.jpg 58KB
dongx2686_b.jpg 67KB
数字图像库
8.jpg 2KB
61.jpg 2KB
2.jpg 1KB
1.jpg 643B
6.jpg 1KB
53.jpg 1KB
3.jpg 1KB
5.jpg 963B
11.jpg 794B
4.jpg 1KB
81.jpg 1KB
9.jpg 1KB
7.jpg 881B
91.jpg 2KB
51.jpg 1KB
31.jpg 1KB
sudokuApp.m 6KB
1403895698_BOg83h.jpg 23KB
view.jpg 24KB
共 29 条
- 1
资源评论
slandarer
- 粉丝: 5w+
- 资源: 21
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功