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
Matlab实现数独小程序.zip
版权申诉
155 浏览量
2022-06-25
14:22:47
上传
评论
收藏 395KB ZIP 举报
天天Matlab科研工作室
- 粉丝: 2w+
- 资源: 7251
最新资源
- 3122080306 邹子轩 实验报告二.docx
- 基于STM32 NUCLEO板设计彩色LED照明灯(纯cubeMX开发)(大赛作品,文档完整,可直接运行)
- 发那科工业机器人保养大全
- Sphere.h
- REMD固有时间尺度分解信号分量可视化(Matlab完整源码和数据)
- 嵌入式系统双单片机STC89C52+STC15W104多功能学习板电路图可扩展 适用于单片机初学者和教学
- 基于STM32蓝牙控制小车系统设计(硬件+源代码+论文)大赛作品
- XILINXFPGA源码基于Spartan3火龙刀系列FPGA开发板VGA测试例程
- Java聊天室的设计与实现【尚学堂·百战程序员】
- python中matplotlib教程
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈