0、简介

这个小作品是我的数字图像处理课程设计,应用基本的图像处理知识与MATLAB的基本脚本编程,实现一个简单的找茬软件。软件实现过程中使用到的找茬游戏图片来源有“梦幻找茬”、“图图找茬”。如有兴趣的人可以亲自玩下这两个游戏。本程序主要目的是练习数字图像处理的基本知识、数学形态学以及MATLAB语言。由于时间与能力的有限,并没有做的很好,各位大神小踩,谢谢。

1、所需知识

matlab基本语言;

matlab GUI实现;

数字图像处理基本知识;

数学形态学基本知识;

2、算法函数实现过程

1)图像获取分割

原本的课程设计要求就是要求使用的是游戏界面截图,使用的图片就是存在两边的图,两边的图是存在差异区域的,首先要做的就是将图像简单进行竖直平分分割。

   

2)计算图像偏移裁剪

由于一般的截图左右两边的图并不能保证对称,所以我们需要计算利用图片的25%中心区域来计算左右两边图的偏移量,再使用这偏移量来裁剪使得两边的图片尽可能重合。这样查找差异区域的时候就不会出现额外因偏移出现的错误标定。由于我测试的图像使用的是800*500的图,逐个像素点计算,共需要比较的像素点个数大概是800*500*0.25*20=2000 000次,所以一般的电脑都需要3分钟。

3)三通道不相同区域提取

原本课程设计的要求是用彩色转灰度后再提取出不同的区域,但是转换得到的灰度的茬的差异有些存在的不明显,所以最后我选择使用红蓝绿三通道来分离出茬的区域。利用原有的颜色差异来分离出茬的区域成效明显好于灰度图像提取。我这里是直接使用MATLAB内置有的imabsdiff()函数来直接获取各个通道不同的区域。然后将各个通道不同的区域相加起来,再使用imopen(),imclose()函数进行开闭运算。实际的图像看起来是一致的颜色,其实存在有一定的差值,甚至是较大的毛刺,所以必须是使用开闭运算来消除毛刺与噪声。

4)矩形框标定显示

为了更明显的显示出茬的位置,最后使用一个矩形标定的函数来绘制出茬的区域。首先是使用MATLAB自带的工具函数bwlabel()获取茬区域的连通区域,获得到数据有标定标定好的连通区域与连通区域个数。 再用regionprops()获取连通区域信息,得到的信息有面积"area"、矩形框位置"boundingbox"、连通区域中心"central"。得到这些数据,就可以很好的使用矩形框定函数框定茬的位置。

5)MATLAB GUI实现

MATLAB的GUI还是比较简单的,初学者需要注意的就只有

a.初始化函数

b.使用句柄传参、或者设置全局变量传参

c.按键响应事件,实际就是调用的函数

MATLAB的所有显示都可以是控件显示的,如 :set(handles.radiobutton1,'visible','off');  就是设置单选框的隐藏不显示,涉及到的参数键与值都可以在GUI绘制的界面的属性中找到。最后一件事情就是MATLAB的GUI实现之后可以打包成可执行文件,但是需要使用的电脑需要安装编译电脑上的MCRInstaller.exe程序。所以MATLAB的GUI程序几乎是不可能脱离MATLAB运行,因为GUI打包几乎都涉及到MATLAB内置的画图函数,所以目的主机必须要拥有MATLAB整个运行库才可以运行GUI。

3、找茬算法源码

主文件:

clear

close all;

%%读取图片,并显示

fileName = 'test14.png';

img = imread(fileName);

% figure();imshow(img);title('原图');

%获取图片信息

[image_h,image_w,image_c] = size(img);

image_w2 = ceil(image_w/2);

%获取灰度图像

img_gray = rgb2gray(img);

%%对源图片对半竖直分割

img_M1 = zeros(image_h,image_w2,3);

img_M2 = zeros(image_h,image_w2,3);

img_M1 = imcrop(img,[0,0,image_w2,image_h]);

img_M1 = uint8(img_M1);

img_M1_gray = rgb2gray(img_M1);

figure(); imshow(img_M1);title('原左图');

img_M2 = imcrop(img,[image_w2+1,0,image_w2,image_h]);

img_M2 = uint8(img_M2);

img_M2_gray = rgb2gray(img_M2);

figure(); imshow(img_M2);title('原右图');

%%判断是否需要一键找茬

% yijian_flag = 0;

% char = input('是否一键找茬,y/n:','s');

% if char=='y'

% yijian_flag = 1;

% end

% num_fine = 0;

% %输入偏移量

% if yijian_flag == 0

% while(~num_fine)

% pic = input('请确定要偏移的图,l/r:','s');

% pic_dx = input('请输入竖直偏移量(0~8):');

% pic_dy = input('请输入竖直偏移量(0~8):');

%

% if( ((pic=='l')| (pic=='r'))&(pic_dx>=0)& (pic_dx<=8)&(pic_dy>=0)& (pic_dy<=8) )

% num_fine = 1;

% else

% fprintf('输入错误,请重新输入!!!\n');

% end

% end

% else

% pic = 'l';

% pic_dx = 0;

% pic_dy = 0;

% end

%针对test01.jpg默认值

pic = 'l';

pic_dx = 0;

pic_dy = 0;

%%进行图片偏移

img_M1_O = zeros(image_h+pic_dx,image_w2+pic_dy,3);

img_M2_O = zeros(image_h+pic_dx,image_w2+pic_dy,3);

img_M1_O = uint8(img_M1_O);

img_M2_O = uint8(img_M2_O);

img_M1_O(:,:,:) = 255;

img_M2_O(:,:,:) = 255;

if pic==1

for i = 1:image_h

for j = 1:image_w2

img_M1_O(i+pic_dx,j+pic_dy,:) = img_M1(i,j,:);

end

end

for i = 1:image_h

for j = 1:image_w2

img_M2_O(i,j,:) = img_M2(i,j,:);

end

end

else

for i = 1:image_h

for j = 1:image_w2

img_M2_O(i+pic_dx,j+pic_dy,:) = img_M2(i,j,:);

end

end

for i = 1:image_h

for j = 1:image_w2

img_M1_O(i,j,:) = img_M1(i,j,:);

end

end

end

figure();imshow(img_M1_O);title('左图偏移后');

figure();imshow(img_M2_O);title('右图偏移后');

%%计算出左右图片偏差值

img_M1_gray = rgb2gray(img_M1_O);

img_M2_gray = rgb2gray(img_M2_O);

% 根据图片中心锁定图片中心

image_h41 = ceil(image_h/4);

image_w41 = ceil(image_w2/4);

image_h43 = image_h41*3;

image_w43 = image_w41*3;

differ = 255*200*200;

differ = uint32(differ);

dx_min = 0;

dy_min = 0;

tmp = 0;

count = 0;

count = uint32(count);

qiuhe = zeros(600);

qiuhe = uint32(qiuhe);

z = 1;

for dx=-(10+pic_dx):10+pic_dx

for dy=-(10+pic_dy):10+pic_dy

for i=image_h41:image_h43

for j=image_w41:image_w43

tmp = uint32(abs(img_M1_gray(i,j)-img_M2_gray(i+dx,j+dy)));

count = count + tmp;

end

end

qiuhe(z) = count;

z = z+1;

if count0

str = sprintf('有茬,茬个数:%d',n);

title(str, 'Color', 'r');

else

str = sprintf('没有茬');

title(str, 'Color', 'g');

end

标定矩形框:

function [state,result]=draw_rect(data,pointAll,windSize,showOrNot)

% 函数调用:[state,result]=draw_rect(data,pointAll,windSize,showOrNot)

% 函数功能:在图像画个长方形框

% 函数输入:data为原始的大图,可为灰度图,可为彩色图

% pointAll 框的左上角在大图中的坐标(每行代表一个坐标),

% 注意:在图中的坐标系为第一列为y,第二列为x(很奇怪的)

% windSize 框的大小 分别表示长宽

% showOrNot 是否要显示,默认为显示出来

% 函数输出:state -- 表示程序结果状态

% result - 结果图像数据

if nargin < 4

showOrNot = 0;

end

rgb = [255 0 0]; % 边框颜色

lineSize = 2; % 边框大小,取1,2,3

windSize(1,1)=windSize(1,1);

windSize(1,2) = windSize(1,2);

if windSize(1,1) > size(data,1) ||...

windSize(1,2) > size(data,2)

state = -1; % 说明窗口太大,图像太小,没必要获取

disp('the window size is larger then image...');

return;

end

result = data;

if size(data,3) == 3

for k=1:3

for i=1:size(pointAll,1) %画边框顺序为:上右下左的原则

result(pointAll(i,1),pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k);

result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+windSize(i,1),k) = rgb(1,k);

result(pointAll(i,1)+windSize(i,2),pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k);

result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2),k) = rgb(1,k);

if lineSize == 2 || lineSize == 3

result(pointAll(i,1)+1,pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k);

result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+windSize(i,1)-1,k) = rgb(1,k);

result(pointAll(i,1)+windSize(i,2)-1,pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k);

result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+1,k) = rgb(1,k);

if lineSize == 3

result(pointAll(i,1)+1,pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k);

result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+windSize(i,1)+1,k) = rgb(1,k);

result(pointAll(i,1)+windSize(i,2)+1,pointAll(i,2):pointAll(i,2)+windSize(i,1),k) = rgb(1,k);

result(pointAll(i,1):pointAll(i,1)+windSize(i,2),pointAll(i,2)+1,k) = rgb(1,k);

end

end

end

end

end

state = 1;

if showOrNot == 1

figure;

imshow(result);

end

%%这个我是直接使用了网上大神写好的代码修改一下适应找茬实现

%https://blog.csdn.net/loveaborn/article/details/8545809

由于GUI的代码、GUI界面以及源文件过大,我无法直接使用博客园分享,所以稍后给出其他方式分享:

最后我推荐一下博客园里面非常好的数字图像处理的数学形态学处理算法基础的帖子:

http://www.cnblogs.com/tornadomeet/archive/2012/03/20/2408086.html

最后,本人初次写博客,不妥之处望指出,谢谢!

图像找茬 matlab,数字图像处理、数学形态学、MATLAB GUI实现简单找茬软件相关推荐

  1. 图像处理边缘增强matlab,数字图像处理实验 matlab 图像增强 边缘检测 图像操作.doc...

    数字图像处理实验 matlab 图像增强 边缘检测 图像操作 实验1 点运算和直方图处理 实验目的 1. 掌握利用Matlab图像工具箱显示直方图的方法 2. 掌握运用点操作进行图像处理的基本原理. ...

  2. cmyk图像处理matlab,数字图像处理及MATLAB实现 全套课件.pptx

    出版社;1.1 图 像1.1.1 图像1.1.2 图像信息的重要性1.2 图像技术及图像的分类1.2.1 图像技术1.2.2 图像的分类;图1.1 图像实例(a)景物图像 (b)显微图像 ;(1)灰度 ...

  3. matlab数字图像处理函数,MATLAB数字图像处理学习(二)|常用函数

    以下的学习整理来自<数字图像处理原理与实践(MATLAB版)> im2bw 功能:将索引图象.灰度图像和RGB彩色图像转换为二值图像 调用形式: >BW = im2bw(I,leve ...

  4. Matlab数字图像处理——图像的空间变换

    Matlab空间变换函数 imtransform Matlab空间变换函数 imtransform 可以实现图像仿射变换(如 平移.旋转.剪切.缩放).投影变换, 该函数可与 maketform 配合 ...

  5. Matlab数字图像处理——图像处理工具箱Image Processing Toolbox

    Image Processing Toolbox 图像处理工具箱包含的功能: 图像的读取和保存 图像的显示 创建GUI 图像的几何变换 图像滤波器设计及线性滤波 形态学图像处理 图像域变换 图像增强 ...

  6. Matlab数字图像处理——图像文件的读取

    文章目录 一.Matlab中获取图像信息的函数 imfinfo 二.Matlab读取图像文件的函数 imread 三.Matlab保存图像文件的函数 imwrite 完整目录 一.Matlab中获取图 ...

  7. matlab图像低通滤波器 实验报告,基于matlab数字图像处理之低通滤波器

    <基于matlab数字图像处理之低通滤波器>由会员分享,可在线阅读,更多相关<基于matlab数字图像处理之低通滤波器(6页珍藏版)>请在人人文库网上搜索. 1.实践一:理想低 ...

  8. MATLAB数字图像处理系统-形状分类

    MATLAB数字图像处理系统-形状分类 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  9. MATLAB数字图像处理复习概览

    MATLAB数字图像处理 第1章 绪论 数字图像的概念 数字图像处理 第2章 数字图像处理基础 数字图像的生成与表示 数字图像的数值描述 第3章 图像基本运算 图像几何变换 几何变换基础 位置变换 几 ...

  10. 精通Matlab数字图像处理与识别nbsp;nbsp;nbsp;nbsp;nbsp;nbsp;

    文章目录 1. 数字图像处理与识别 1.1数字图像 1.2 数字图像处理与识别 1.3 数字图像处理的预备知识 1.4 基本的图像操作 2. MATLAB基础 2.1 常用命令 2.2 矩阵 2.3 ...

最新文章

  1. 刘锋:互联网左右大脑结构与钱学森开放复杂巨系统
  2. Angular ng-template元素的学习笔记
  3. 【转】Dynamics 365Online 如何启用手机端APP的离线功能
  4. 考考你,能看出这一段代码是用哪个编程语言写的吗?
  5. 携号转网移动用户转出最多;微软称 8 万台电脑感染病毒;TensorFlow 2.1 rc0 发布 | 极客头条...
  6. [2010-9-8]
  7. 参加一场 Google IO 需要多少资金?
  8. HTTP缓慢拒绝服务攻击
  9. 用python的turtle库画圣诞树
  10. CF1041F Ray in the tube
  11. 数字盲打怎么练_键盘上的数字键怎么练才能盲打?
  12. 深度学习剖根问底:SGD算法的优化和变种
  13. 阿里巴巴、腾讯、字节跳动“顺从”互联网监管,提交应用算法详情
  14. 用声卡实现的存储示波器
  15. 【C】例9.7有n个结构体变量,内含学生学号、姓名和3门课程的成绩。要求输出平均成绩最高的学生的信息(包括学号、姓名、3门课程成绩和平均成绩)
  16. 怎么将视频进行压缩?视频压缩简单的步骤是什么?
  17. 【转】嵌入式开发正在日薄西山_有道理哦
  18. 计算机应用powerpoint试题,《计算机应用基础》试题二
  19. 【Python机器学习及实践】进阶篇:模型实用技巧(特征提升)
  20. 云计算公司城市云申请新三板挂牌上市

热门文章

  1. 七倍压电路图_倍压整流电路图大全(九款倍压整流电路设计原理图详解)
  2. 虚拟机无法启动提示give root password for maintenance的多种解决方法
  3. 用计算机发传真,如何用电脑发网络传真?在电脑里怎么发传真?
  4. shell win10 改成cmd_Win10 的 PowerShell、CMD 和 Windows Terminal 全方位美化配置方法
  5. 房屋抵押贷款需要什么手续和条件?
  6. Dask核心功能介绍及与Spark的比较
  7. SOM -- 自组织特征映射网络
  8. imessage_iMessage何时将邮件标记为“已读”?
  9. Windows的Safari(可能)已死:如何迁移到另一个浏览器
  10. “看得破、忍不过;想得到,做不来​。”