基于MATLAB的数字图像处理系统设计
一、课题背景
MATLAB 作为国内外流行的数字计算软件,具有强大的图像处理功能,界面简洁,操作直观,容易上手,而且是图像处理系统的理想开发工具。
笔者阐述了一种基于MATLAB的数字图像处理系统设计,其中包括图像处理领域的大部分算法,运用 MATLAB 的图像处理工具箱对算法进行了实现,论述了利用系统进行图像显示、图形表换及图像处理过程,系统支持索引图像、灰度图像、二值图像、RGB 图像等图像类型;支持BMP、GIF、JPEG、TIFF、PNG 等图像文件格式的读,写和显示。
上述功能均是在MATLAB 语言的基础上,编写代码实现的。这些功能在日常生活中有很强的应用价值,对于运算量大、过程复杂、速度慢的功能,利用 MATLAB 可以既能快速得到数据结果,又能得到比较直观的图示。
二、 数字图像处理研究的内容
一般的数字图像处理的主要目的集中在图像的存储和传输,提高图像的质量,改善图像的视觉效果,图像理解以及模式识别等方面。新世纪以来,信息技术取得了长足的发展和进步,小波理论、神经元理论、数字形态学以及模糊理论都与数字处理技术相结合,产生了新的图像处理方法和理论。数字图像处理技术主要包括:
1、图像增强
目前图像增强技术根据其处理的空间不同,可分为空域法和频域法两大类,前者根据在图像所在的像素空间进行处理,后者是通过对图像进行傅里叶变换后在频域上间接进行的。
2、图像恢复
图像恢复,也称为图像还原,其目的是尽可能地减少或者去除数字图像在获取过程中的降质,恢复被退化图像的本来面貌,从而改善图像质量,以提高视觉观察效果。
3、图像变换
图像变换就是把图像从空域转换到频域,对原图像函数寻找一个合适变换的数学问题,众多图像变换方法不断出现,从傅里叶变换发展到余弦变换,再到现在非常流行的小波变换,图像变换分为可分离变换和统计变换两大类。
4、图像压缩
数字图像需要很大的存储空间,因此无论传输或存储都需要对图像数据进行有效的压缩。其目的是生成占用较少空间而获得与原图十分接近的图像
5、图像分割
图像分割的目的是把一个图像分解成它的构成成分,图像分割是一个十分困难的过程。图像分割的方法主要有 2 类:一种是假设图像各成分的强度值是均匀的,并利用这个特性,这种方法的技术有直方图分割,另外一种方法是寻找图像成分之间的边界,利用的是图像的不均匀性,基于这种方法的的技术有梯度法分割。
6、边缘检测
边缘检测技术用于检测图像中的线状局部结构。大多数的检测技术应用某种形式的梯度算子。边缘检测广泛应用于图像分割、图像分类、图像配准和模式识别,在大多数的实际应用中,边缘检测是当做一个局部滤波运算完成的。
三、图像处理系统的详细设计
用 MATLAB 对图像进行处理是当前科技领域的一个重要的课题,它采用的是用一组有序的灰度或彩色数据元素构成图像,数组的每一个元素对应于图像的一个像素值。这样 MATLAB 就可以利用其强大的矩阵计算功能实现对图像的数字处理。本案所设计的系统主要是利用 MATLAB 所提供的图形用户界面(GUI),实现一个可视的面向对象的操作界面。
3.1 设计原则
由于要求不同,设计出来的界面也就千差万别。但是,自从人们开始设计图形界面以来,界面设计的评判标准却没有太大的变化。简单说来,一个好的界面应遵从以下三个原则:简单性、一致性、习常性。
1、简单性
设计界面时,应力求简洁、直接、清晰地体现出界面的功能和特征。那些可有可无的功能应尽量删去,以保持界面的清洁。
2、一致性
所谓一致性包含两层意义:一是自己开发的界面风格要尽量一致;二是新设计的界面要与其他已有的界面风格不要截然相左。这是因为用户在初次使用新界面时,总是习惯于凭借经验进行试探。
3、习常性
设计界面时,应尽量使用人们所熟悉的标志和符号。用户可能并不了解界面的具体含义及操作方法,但他也可以根据熟悉标志做出正确猜测,自学入门。
4、其他考虑因素
除了以上对界面的静态要求外,还应注意界面的动态性能。如对用户操作的响应要迅速、连续。
3.2 设计的一般步骤
1、分析界面所要求实现的主要功能,明确设计任务。
2、在稿纸上绘出界面草图,并对其进行审查。
3、按照构思的草图,上机制作静态界面,并进行检查。
4、编写界面动态功能的程序,对其功能进行逐项检查。
3.3 系统功能的模块设计
根据当前图像处理系统的总体设计样式和要求,该系统主要包括文件、工具、编辑、图像、调色、图像类型转换、颜色空间转换、正交变换等模块。其模块图如3.1所示:
图3.1 系统功能框图
3.4 窗口界面的实现
该系统界面的设计主要是利用MATLAB所提供的GU(IGraphUser Interface)向导设计控件而完成的,该向导可以实现多种控件的设计,给用户提供了一种友好的交互方式,同时也给操作带来很多方便。图形用户界面GUI是包含图形对象(如图形窗口、菜单、控件、文本)的用户界面,用户以某种方式选择或者击活这些对象会发生变化或引起动作。
1、启动 GUI 的方法
启动图形用户界面的方法有很多种,例如可以利用工具栏上的命令按钮,也可以采用菜单和命令的方式。在本人设计的案例中采用的是命令方式:在命令窗口直接输入 guide 命令,弹出的窗口如图 3.2 所示:
图3.2 GUI 启动界面
在弹出的guide quick ate new gui选项卡里面的start 窗口中选择 creBlank GUI 选项,这样就可以进入图形用户界面来设计我们的系统静态界面。
图3.3 Guide 界面
上图就是 Guide 提供的图形界面设计工具集,在此界面下就可以利用控件组件、文本菜单、排列工具等对系统的界面进行设计。该系统的静态界面如图 3.4 所示:
图3.4 Guide 设计界面
当静态界面设计完成以后,对该界面进行保存,此时 Guidie将自描述,动生成两个发布文件,分别是.fig 文件和.m 文件。Fig 文件:该文件包括图形窗口及其所有后裔的完全包括:该文件包括 GUI 设计、控制函数以及为子函数的用户控u Edit 对系统的菜所有对象的属性值。Fig 文件是一个二进制文件,调用 hgsave命令或界面设计编辑器的 file 菜单 save 选项保存图形窗口时将产生该文件。Fig 文件最有用的地方之一就是对象句柄的保存和引用,可以使用 open、openfig 和 hgload 命令打开一个后缀为.fig的文件。M 文件件回调函数,主要用于控制 GUI 展开时的各种特征。这个 M文件可以分为 GUI 初始化和回调函数两个部分,用户控件的回调函数根据用户与 GUI 的具体交互方式分别调用。
设计好系统的界面以后,接下来就要利用 Men单进行设计,创建菜单的第一步就是利用 GUI 的工具栏上的Menu Edit 按钮启动相应的窗口。然后使用 New Menu 工具栏来创建菜单,然后可以指定菜单的属性。例如可以设置菜单的标签、分隔符、选种模式以及回调函数字符串。第二步就是创建菜单项。
可以使用 New Menu Item 工具来添加菜单项,每一个菜单项也可以有级联的子菜单项。如果想要定义快捷菜单可以使用 NewContext Menu 工具来进行创建。本系统的菜单创建效果如图 3.5 所示:
图3,5 菜单
3.5 各个模块的实现
3.5.1 文件模块
在文件模块中主要是包括对图像文件的打开、保存、打印设置和退出等操作。其中对图像文件如何读取以及如何写入是本模块的重点,下面主要介绍这两个功能的实现。
1、打开
对于打开菜单,主要利用的是 MATLAB 所提供的 uigetfile( )标准读盘文件处理对话框来选择要打开的图像,然后用 imread( )函数实现对图像文件的读取。其主要代码如下:
function open_Callback(hObject, eventdata, handles)
[filename, pathname] = uigetfile({'*.jpg';'*.bmp';'*.tif'}
S = imread([pathname filename]);
handles.S = S;
axes(handles.axes1);
imshow(S);
handles.output = hObject;
guidata(hObject, handles);
2、保存
保存菜单的实现主要应用uiputfile()标准写盘处理对话框来实现,其代码如下:
function save_Callback(hObject, eventdata, handles)
global hresult;
[filename,pathname, filterindex] = uiputfile( ...
{‘*.bmp;*.jpg;*.tif’,’Picture styles(*.bmp;*.jpg;*.tif)’;
‘*.bmp’,’Bitmap-files(*.bmp)’; ...
'*.jpg','J-PEG (*.jpg)'; ...
'*.tif','Gif-files (*.tif)'; ...
'*.*', 'All Files (*.*)'}, ...
'Save as');
If isequal([ ilename,pathname],[0,0])
return
else
File=fullfile(pathname,filename);
saveas(hresult,File)
End
3.5.2编辑模块的实现
该模块主要是对所要处理的图像进行一些常规的编辑操作,可以实现对图片进行放大和缩小,也可以对图片进行剪切和旋转。当然还可以实现很多有关编辑的操作,但是无论哪一种操作,其关键是如何获得该图像的句柄。句柄实际上就是分配给每个对象的数字标识,每次创建对象时,MATLAB就会自动为它创建一个唯一的句柄,这样只要我们能找到该句柄,就能对该对象进行操作。在MATLAB中,图形对象是一幅图中很独特的成分,它可以被单独地操作。由图形命令产生的每一件东西都是图形对象,它们包括图形窗口不仅仅说是图形,还有坐标轴、线条、曲面、文本和其它。这些对象按父对象和子对象组成层次结构。计算机屏幕是根对象,并且是所有其它对象的父对象。图形窗口是根对象的子对象;坐标轴和用户界面对象是图形窗口的子对象;线条、文本、曲面、补片和图象对象是坐标轴对象的子对象。这种层次关系在图 3.6 中给出
图3.6 对象层次结构
根对象可包含一个或多个图形窗口,每一个图形窗口可包含一组或多组坐标轴。所有其它的对象(除了uicontrol和uimenu外)都是坐标轴的子对象,并且在这些坐标轴上显示。所有创建对象的函数当父对象或对象不存在时,都会创建它们。例如,如果没有图形窗口,plot(rand(size([1:10])))函数会用缺省属性创建一个新的图形窗口和一组坐标轴,然后在这组坐标轴内画线。
每次创建一个对象时,就为它建立一个唯一的句柄。计算机屏幕作为根对象常常是 0。Hf_fig=figure命令建立一个新的图形窗口,变量Hf_fig中返回它的句柄值。图形窗口的句柄为整数,通常显示在图形窗口标题条中。其它对象句柄是MATLAB满精度的浮点值。所有产生对象的MATLAB函数都为所建立的每个对象返回一个句柄(或句柄的列向量)。这些函数包括plot,mesh,surf及其它。有一些图形由一个以上对象组成。比如,一个网格图由一个曲面组成,它只有一个句柄;而waterfall图形由许多线条对象组成,每个线条对象都有各自的句柄。例如,Hl_wfall=waterfall(peaks(20)) 对线条返回一个包含着 20 个句柄的列向量。在MATLAB中常用获得句柄的函数有以下几种
gcf :获取当前图形窗口的句柄
gca :获取当前坐标轴的句柄
gco :获取当前对象的句柄
gcbo :获取当前正在调用的对象的句柄
gcbf :获取包括正在执行调用的对象的图形的句柄
这样我们就可以使用这几个函数获得要操作对象的句柄。例如旋转菜单功能的实现就可以利用这样的代码实现:function xuanzhuan_Callback(hObject, eventdata, handles)
h = getimage(gco); % 获得当前对象的句柄
j=imrotate(h,-15); % 把图像以 15 度为单位顺时针旋转,并把该图象的句柄付给 jimshow(j)% 显示旋转后的图像在这个例子中,其中 h=getimage(gco)语句的作用就是利用getimage()函数获取当前图形对象的句柄,并把该句柄的值赋给了变量 h。以后只要是对该图像操作只要找到句柄 h 即可。本例子是只要单击一次编辑菜单的旋转命令,当前的图像就会顺时针旋转 15 度。
原始图像 旋转后图像
图3.7 旋转
其他编辑功能的实现与上边的例子大致相同,故一些具体的实现省略,详见程序的代码。
3.5.3 图像模块的实现
在 MATLAB 中,一幅图像可能包含一个数据矩阵,也可以包含一个颜色映射矩阵。因此 MATLAB 所能够处理的 4 种基本图像就是:索引图像、灰度图像、RGB 图像、二进制图像。该模块的主要功能就是把一幅真色彩图像显示成上述四种图像。该模块主要包括灰度、灰度倒置、腐蚀、膨胀、边界图等功能。
1、灰度:灰度变换是一种简单而实用的方法,它可以使图像的动态范围增大,图像的对比度扩展,图像变清晰,特征明显,是图像增强的重要手段之一。它可分为比例线性变换、分段线性变换、非线性灰度变换。本例子采用的是分段线性变换。对感兴趣的(20~180)区间进行灰度变换,程序代码如下:
x1= getimage(gco);
figure
imshow(x1)
f0=0;g0=0;
f1=20;g1=10
f2=180;g2=230;
figure,plot([f0,f1,
r1=(g1-g0)/(f1-f0);
b1=g0-r1*f0;
r2=(g2-g1)/(f2-f1);
b2=g1-r2*f1;
r3=(g3-g2)/(f3-f2);
b3=g2-r3*f2;
[m,n]=size(x1);
x2=double(x1);
for i=1:m
for j=1:n
f=x2(i,j);
(f<=f2)
)=r1*f+b2;
ow(mat2gray(g))
g(i,j)=0;
if(f>=f1)&g(i,j)
elseif(f>=f2)&(f<=f3)
g(i,j)=r3*f+b3;
end
end
end
figure
imshow(mat2gray(g))
图3.8 灰度变化
原始图像 灰度图像
图3.9 处理图像
运行该程序后,得到分段线性变换后的图像。可以看出,通过这样一个变换,原图中灰度值在(0~20)和(180~255)之间的动态范围减少了,而原图中灰度值在 180~255 之间的动态范围增加了,从而这个范围内的对比度增加了,具体变化为图像中树干以上的区域两度明显增强。
2、腐蚀:腐蚀操作就是把图像对象中边界的某些像素删除,输出像素值是输入图像相应像素及邻域内所有像素的最小值。
function fs_Callback(hObject, eventdata, handles)
h = getimage(handles.axes1);
se=strel('arbitrary',eye(10));
h1=imerode(h,se);
figure;
imshow(h1)
图3.10 腐蚀
3、膨胀:膨胀一般是给图像中的对象边界添加像素。在膨胀操作时,输出像素值是输入图像相应像素及邻域内所有像素的最大值。
function pz_Callback(hObject, eventdata, handles)
h = getimage(handles.axes1);
se=strel('square',5);
h2=imdilate(h,se);
figure;
imshow(h2,'notruesize')
图3.11 膨胀
4、边界图:又称为骨架提取,寻找二值图像的细化结构是图像处理的一个基本问题。在图像识别和图像压缩中要经常用到这样的细化结构。例如,在识别字符之前,往往要对字符做细化处理,求出字符的细化结构。
function ys_Callback(hObject, eventdata, handles)
i=getimage(handles.axes1);
BW=edge(i,'sobel');
imshow(BW)
图3.12 边界提取
以上各种操作都是形态学图像处理经常要用到的一些基本操作,他们对于形态学重构有着重要的作用。所谓形态学重构就是根据一幅图像的特征对另一幅图像进行重复膨胀、或腐蚀等操作,直到该图像的像素值不再变化为止,用来强调图像中与掩模图像中指定对象相一致的部分,同时忽略图像中的其他对象。这在医学影像领域有着极其重要的作用。
3.5.4图像类型转换模块的实现
要对一幅索引图像滤波,首先必须将它转换成真色彩图像,否则要的作用。图像类型转换模块的实现在许多图像处理工作中,都对图像类型有特定的要求,比如结果是毫无意义的。在MATLAB中,各种图像类型之间的转换关系如图所示:
图3.13 图像转换关系
MATLAB 的图像处理工具箱提供了许多图像类型转换函数,来实现各种图像类型的转换。例如:dither 函数,该函数的功能是通过颜色抖动来增加输出图像的颜色分辨率,从而实现转换图像。该函数的调用格式如下:X=dither(RGB,map) 表示将真色彩图像 RGB 按照指定的颜色映 抖动成索引图像MATLAB像表 map 抖动成索引图像X。BW=dither(I) 表示将灰度图像 I 抖动成二值图像 BW。
例:
I=imread(‘trees.tif’);
Subplot(1,2,1)
Imshow(I)
BW=dither(I);
Subplot(1,2,2)
Imshow(BW)
图3.14 二值处理
因此在对图像的处理的过程中图像类型的转换变得尤为重要。该模块以索引图像、灰度图像和真色彩图像之间的相互转换为例,具体实现代码如下:
1、m2bw:该函数的功能是通过设置亮度阈值将真色彩、索引、灰度图像转换成二值图。该函数的调用格式如下:
BW=im2bw(I,level)
BW=im2bw(x,map,level)
BW=im2bw(rgb,level)
分别表示将灰度图像、索引图像和真色彩图像转换成二值图像 BW,level 是归一化的阈值,取值在[0,1]之间。本系统所采用的是第一种调用格式,具体程序如下:
function im2bw_Callback(hObject, eventdata, handles)
h = getimage(handles.axes1);
subplot(1,2,1);
imsh
show );
ow(h);
bw=im2bw(h,0.8);
subplot(1,2,2);
im (bw);
图3.15 灰度到二值转换
2、rgb/ind:将 RGB 图像转换成索引图像
function rgb2ind_Callback(hObject, eventdata, handles)
h = getimage(handles.axes1);
[x,map]=rgb2ind(h,0.7);
imshow(x,map)
图3.16 真色彩至索引转换
3.5.5 正交变换
在图像处理技术中,图像的正交变换技术有着广泛的应用,是图像处理的重要工具。通过变换图像,改变图像的表示域及表示数据,可以给后继工作带来极大的方便。例如离散余弦变换(DCT 变换)使能量集中在少数数据上,从而实现数据压缩,便于图像传输和存储。
1、DCT变换:离散余弦变换,简称DCT,是一种实数域变换,其特点是变换速度快,很适于做图像压缩和随机信号处理。DCT变换是JPEG、MPEG等数据压缩的重要数学基础。DCT变换的实现方法有两种:一种是基于FFT的快速算法,这是通过工具箱提供的dct2 函数实现的;另一种使DCT变换矩阵的方法,这种方法非常适合做 8×8 或 16×16 的图像块的DCT变换,工具箱提供了dctmtx函数来计算变换矩阵。下面的例子将一幅图像进行余弦变换,然后将DCT变换值小于 10 的系数设为 0,再利用idt2 函数重构图像。
function dct_Callback(hObject, eventdata, handles)
h = getimage(handles.axes1);
g=rgb2gray(h);
d=dct2(g);
figure;
subplot(1,2,1);
imshow(log(abs(d)),[]);
图像的绝大部分能量位于变换矩阵的左上角。
subplot(1,2,1);
d(abs(d)<10)=0;
i=idct2(d)/255;
subplot(1,2,2);
imshow(i)
下面图像就是经过 DCT 变换后的图像,通过该图像可以看出
图3.17 DCT 变换
下图则是经过重构的图像和原图像的对比。
图3.18 压缩重构
通过对比可以看出,经过 DCT 压缩后,图像的绝大部分能量都得到了很好的保留,所以重构图像的时候才能保证重构以后的图像有很少的失真。
2、 Radon变换:Radon变换在图像处理领域有着很重要的应用价值,尤其是对医学的影像领域有着重要的指导意义。医学上常用的CT扫描就是基于 衰减系数,如果能确定三维图像。但是通过X射线透视时,只能测量到人体的直线上的X射线衰减系数的平均值,当直线变化时,此值也会跟着变化,这样就很难重建其断层。但是,能否通过扫描测量的平均值求整个衰减系数的分布,从而有效的重建图像呢?Radon变换为此提供了一个非常好的思路。本系统所用的Radon变换就是对图像先进行骨架提取,再沿 0 度到 180 度每隔一度作Radon变换,然后利用iradon函数来重构骨架图像。通过图像对比可以知道,重构后的图像和原图像十分接近。
function radon_Callback(hObj
- to be defined in a future version of
% handles structure
h =
bw=edge(h);
figu
subplot(2,2,1);
imshow
theta=0:2:178;
[r,xp]=radon(bw
subplot(2,2,2);
imagesc(theta,xp,r);
colorm
不同物质的X射线
人体的衰减系数分布,就能重建其断层或
ect, eventdata, handles)
% hObject handle to radon (see GCBO)
% eventdata reserved
MATLAB
with handles and user data (see GUIDATA)
getimage(handles.axes1);
re;
(bw);
,theta);
ap(hot);
axis off
i2=iradon(r,2);
subplot(2,2,3);
imshow(i2);
图3.19 Radon 变换
3.5.6 其他模块功能的实现
基于MATLAB 的图像处理系统是一个功能强大的系统,它还可以实现颜色空间的转换,能对一些单色图像进行各种调色,也可以调用 MATLAB 绘图工具箱进行各种简单图形的绘制。当然还有许多的功能有待于进一步完善,至于详细的实现代码,在这里就不在赘述。
基于MATLAB的数字图像处理系统设计相关推荐
- java数字图像处理开题报告,基于MATLAB的数字图像处理算法研究与仿真开题报告...
基于MATLAB的数字图像处理算法研究与仿真开题报告 毕 业 设 计 (2013 届) 题 目基于 MATLAB 的数字图像 处理算法研究与仿真 学 院 物理电气信息学院 专 业 通信工程 年 级 0 ...
- 基于MATLAB的数字图像处理的设计与实现 转
基于MAT [摘要]数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人们服务.数字图像处理是一种通 ...
- 【基于MATLAB的数字图像处理】第四章·图像增强
系列文章 ·[基于MATLAB的数字图像处理]第一章·绪论 ·[基于MATLAB的数字图像处理]第二章·视觉系统与图像处理系统 ·[基于MATLAB的数字图像处理]第三章·基本图像变换 ·[基于MAT ...
- 【基于MATLAB的数字图像处理】第三章·基本图像变换
系列文章 ·[基于MATLAB的数字图像处理]第一章·绪论 ·[基于MATLAB的数字图像处理]第二章·视觉系统与图像处理系统 ·[基于MATLAB的数字图像处理]第三章·基本图像变换 ·[基于MAT ...
- 【基于MATLAB的数字图像处理】大作业·综合图像处理平台
系列文章目录 ·[基于MATLAB的数字图像处理]第一章·绪论 ·[基于MATLAB的数字图像处理]第二章·视觉系统与图像处理系统 ·[基于MATLAB的数字图像处理]第三章·基本图像变换 ·[基于M ...
- 基于MATLAB的数字图像处理系统
基于MATLAB的数字图像处理系统 摘要:数字图像处理技术是20世纪60年代发展起来的一门新兴学科,随着图像处理理论和方法的进一步完善,使得数字图像处理技术在各个领域得到了广泛应用,并显示出广阔的应用 ...
- 基于MATLAB的数字图像处理系统GUI界面设计
基于MATLAB的数字图像处理系统GUI界面设计 图像读入 从图形文件中读入图像 imread Syntax: A = imread(filename, fmt) filename:指定的灰度或彩色图 ...
- 基于MATLAB的数字图像处理基本操作
实验一:图像增强 实验名称:图像增强 实验目的:1.熟悉图像在Matlab下的读入,输出及显示: 2.熟悉直方图均衡化: 3.熟悉图像的线性指数等: 4.熟悉图像的算术运算及几何变换. 实验原理: 图 ...
- 基于MATLAB的数字图像处理仿真软件
1 引言 1.1MATLAB介绍 MATLAB是矩阵实验室(Matrix Laboratory)的简称,是美国MathWorks公司出品的商业数学软件,用于算法开发.数据可视化.数据分析以及数值计算的 ...
最新文章
- oracle 查询各科前3名_好消息!新世纪女排教练战绩排名出炉,前3名中国人占据两席...
- 15分钟构建超低成本数据大屏:DataV + DLA
- 批处理 java环境_java环境配置简单批处理方法一键OK
- [Node.js] mySQL数据库 -- 英雄英雄管理系统接口
- 模电之半导体基础篇3(半导体二极管、二极管应用)
- 保存网站快捷方式到桌面的php代码,转的一个朋友的了,加了点判断
- Linux-删除文件空间不释放问题解决
- R语言数据框行转列实例
- vs error:无法打开源文件“stdafx.h
- 剑指offer25 二叉树中和为某一直的路径
- FITC-PEG-Biotin,荧光素-聚乙二醇-生物素的相关检测
- Android Studio不使用数据线调试adb
- Scratch 飞机对战
- Sun JAVA 认证介绍
- python 苹果id申请_Python 解密JWT验证苹果登录
- 【福尔摩斯的约会】-PAT
- 弹性布局的主轴和交叉轴的区别
- 【问题处理】Error response from daemon: Pool overlaps with other one on this address space
- 央视影音大屏版apk下载_央视影音下载安装-央视影音 安卓版v7.0.4-PC6安卓网
- Python 酷q,踩坑粗记,用慕晓飞大神的sdk