图像处理翻译
private declare function varptrarray lib "msvbvm60.dll" alias "varptr" _
(ptr() as any) as long
private declare sub copymemory lib "kernel32" alias "rtlmovememory" _
(pdst as any, psrc as any, byval bytelen as long)
private declare function getobj lib "gdi32" alias "getobjecta" _
(byval hobject as long, byval ncount as long, lpobject as any) as long
private type safearraybound
celements as long
llbound as long
end type
private type safearray2d
cdims as integer
ffeatures as integer
cbelements as long
clocks as long
pvdata as long
bounds(0 to 1) as safearraybound
end type
private type bitmap
bmtype as long
bmwidth as long
bmheight as long
bmwidthbytes as long
bmplanes as integer
bmbitspixel as integer
bmbits as long
end type
private declare function varptrarray lib "msvbvm60.dll" alias "varptr" _
(ptr() as any) as long
private declare sub copymemory lib "kernel32" alias "rtlmovememory" _
(pdst as any, psrc as any, byval bytelen as long)
private declare function getobj lib "gdi32" alias "getobjecta" _
(byval hobject as long, byval ncount as long, lpobject as any) as long
private type safearraybound
celements as long
llbound as long
end type
private type safearray2d
cdims as integer
ffeatures as integer
cbelements as long
clocks as long
pvdata as long
bounds(0 to 1) as safearraybound
end type
private type bitmap
bmtype as long
bmwidth as long
bmheight as long
bmwidthbytes as long
bmplanes as integer
bmbitspixel as integer
bmbits as long
end type
使用VarPtr函数可以得到一个变量的内存地址,在此,我也引用了一个可以指向数组的函数VarPtrArray.
使用CopyMemory则可以将数据从一块内存复制到另一块内存.
使用GetObj则可以获得一个对象的内存,在例子中我们用它来得到StdPicture对象的信息.因此,我们需要定义一个位图结构.
最后我们定义了一个安全数组结构,我们用它来替换实际工作的数组.
我们先定义StdPicture对象,并且假设它已经加载了一个图像. 再定义一个动态数组而不初始化. 我们使用API来将这个数组"分配"到图像的内存,这样,我们在数组上的任何改动就能显示在图像上了. 代码:
dim sa as safearray2d
dim bmp as bitmap
dim mvarbytesperpixel
public sub loadpicarray(p as stdpicture,data() as byte)
if getobj(p.handle, len(bmp), bmp) then '获取图像信息
mvarbytesperpixel = bmp.bmwidthbytes \ bmp.bmwidth
'将数组映射到图像
with sa
.cbelements = 1
.cdims = 2
.bounds(0).llbound = 0
.bounds(0).celements = bmp.bmheight
.bounds(1).llbound = 0
.bounds(1).celements = bmp.bmwidthbytes
.pvdata = bmp.bmbits
end with
'拷贝数组信息
copymemory byval varptrarray(data), varptr(sa), 4
end if
end sub
dim sa as safearray2d
dim bmp as bitmap
dim mvarbytesperpixel
public sub loadpicarray(p as stdpicture,data() as byte)
if getobj(p.handle, len(bmp), bmp) then '获取图像信息
mvarbytesperpixel = bmp.bmwidthbytes \ bmp.bmwidth
'将数组映射到图像
with sa
.cbelements = 1
.cdims = 2
.bounds(0).llbound = 0
.bounds(0).celements = bmp.bmheight
.bounds(1).llbound = 0
.bounds(1).celements = bmp.bmwidthbytes
.pvdata = bmp.bmbits
end with
'拷贝数组信息
copymemory byval varptrarray(data), varptr(sa), 4
end if
end sub
看看发生了什么? 首先我们用GetObj来获取了位图的信息,然后使用这个信息来构造了SafeArray2d结构,特别注意这句:
.pvdata = bmp.bmbits
它将位图位图所在的内存指向了结构.
简单把, 不尽然,这里有些需要注意的地方:
1:图像对象必须预先载入一个图片才能建立一个位图结构,否则它是没有意义的.
2:安全数组对象必须和数组的生存周期一致,如果你在数组被回收之前就释放了安全数组对象,那么数组将无处可指(导致VB崩溃)
3:而在释放数组之前,又必须将数组还原,否则程序会因为内存泄漏而崩溃.
4:一个256色的位图中,每个像素占用1个字节,但是这个字节只是对应了一个调色板索引而并非一个实际的颜色值. 所以你必须在建立数组之前先把索引转换成时机颜色.(这里不讨论16位色) 幸运的是24位色图像中存放的是真正的颜色值,但你依然需要颜色对应到RGB字节中
5:通常来说,位图对应的数组是从左下角开始的,因此数组(0,0)对应图像的最左下角的点
在你弄完之后,你必须复位数组,见下:
view plaincopy to clipboardprint?
public sub releasedata(a() as byte)
copymemory byval varptrarray(a), 0&, 4
end sub
public sub releasedata(a() as byte)
copymemory byval varptrarray(a), 0&, 4
end sub
那么现在这个数组是什么呢?它变成了一个2维数组(X,Y),X代表横坐标,Y代表纵坐标,每一个数组元素是一个字节. 对于256色位图来说,这个字节是一个颜色索引,但对于24位色图像来说,它是一个颜色值. 每个字节对应了颜色值中的RGB中的一个,所以每个像素是有3个个数组元素组成的.例如:一个100X100的图像对应一个300X100大小的数组.
数组的大小相对于像素是不同的,因此你当你读写某个像素的时候必须自己计算:
view plaincopy to clipboardprint?
public sub drawpixel(data() as byte, byval x&, byval y&, byval c&)
select case mvarbytesperpixel
case 1: data(x, y) = c and &hff
case 2: data(x + x, y) = (c \ 256) and &hff
data(x + x + 1, y) = c and &hff
case 3: data(x * 3, y) = (c \ 65536) and &hff
data(x * 3 + 1, y) = (c \ 256) and &hff
data(x * 3 + 2, y) = c and &hff
end select
end sub
public function readpixel(data() as byte, byval x&, byval y&) as long
select case mvarbytesperpixel
case 1: readpixel = data(x, y)
case 2: readpixel = data(x + x, y) * 256& + data(x + x + 1, y)
case 3: readpixel = ((data(x * 3, y) * 256&) + data(x * 3 + 1, y)) * 256& + data(x * 3 + 2, y)
end select
end function
public sub drawpixel(data() as byte, byval x&, byval y&, byval c&)
select case mvarbytesperpixel
case 1: data(x, y) = c and &hff
case 2: data(x + x, y) = (c \ 256) and &hff
data(x + x + 1, y) = c and &hff
case 3: data(x * 3, y) = (c \ 65536) and &hff
data(x * 3 + 1, y) = (c \ 256) and &hff
data(x * 3 + 2, y) = c and &hff
end select
end sub
public function readpixel(data() as byte, byval x&, byval y&) as long
select case mvarbytesperpixel
case 1: readpixel = data(x, y)
case 2: readpixel = data(x + x, y) * 256& + data(x + x + 1, y)
case 3: readpixel = ((data(x * 3, y) * 256&) + data(x * 3 + 1, y)) * 256& + data(x * 3 + 2, y)
end select
end function
这里给出一个速度对比:
加载一个100X100的24位图像, 我把每个像素都设置为红色,使用DMA,SetPixel和PSet时间分别为:5ms,60ms,550ms. 编译之后,分别为:4ms,50ms,70ms. DMA比SetPixel快12倍
附上封装好的模块, 只要把它编译为ActiveX DLL然后就可以在你自己的工程中引用它.
下面是我的测试工程,演示了使用方法:
view plaincopy to clipboardprint?
option explicit
private declare function getpixel lib "gdi32" _
(byval hdc as long, byval x as long, byval y as long) as long
private declare function setpixel lib "gdi32" _
(byval hdc as long, byval x as long, byval y as long, byval crcolor as long) as long
private declare function timegettime lib "winmm.dll" () as long
dim pa as bchpicarray.clspicarray
private sub command1_click()
dim x&, y&, t&
t = timegettime()
for y = 0 to picture1.scaleheight - 1
for x = 0 to picture1.scalewidth - 1
pa.drawpixel x, y, vbred
next x
next y
t = timegettime() - t
picture1.refresh
me.caption = "picarray=" & t
t = timegettime()
for y = 0 to picture1.scaleheight - 1
for x = 0 to picture1.scalewidth - 1
setpixel picture1.hdc, x, y, vbred
next x
next y
t = timegettime() - t
picture1.refresh
me.caption = me.caption & " setpixel=" & t
t = timegettime()
for y = 0 to picture1.scaleheight - 1
for x = 0 to picture1.scalewidth - 1
picture1.pset (x, y), vbred
next x
next y
t = timegettime() - t
picture1.refresh
me.caption = me.caption & " pset=" & t
end sub
private sub form_load()
set pa = new clspicarray
pa.loadpicarray picture1.picture
end sub
private sub form_unload(cancel as integer)
set pa = nothing
end sub
Image enhancement improves the quality of an image and converts it into a more suitable one for human eye and computer analysis through selective emphasis and filtration of certain information. It's an important part of the course of digital image processing. In this paper, histogram enhancement, frequency enhancement, smooth filtering and edge detection are conducted under GUI in Matlab to the images provided in the laboratory course of digital image processing. The interface is well-designed and can be applied to the laboratory course of digital image processing.
针对给出的图像(moon.tif)或者自行选择的灰度图像:1):给图像分别添加高斯噪声和椒盐噪声。
2):对加噪图像的中心区域(100*100)进行空间滤波,尽最大可能消除噪声。
3):对加噪图像的中心区域(100*100)进行频域滤波,尽最大可能消除噪声。
技术描述:
对图像进行加高斯噪声和椒盐噪声处理;对包含高斯噪声和椒盐噪声的图片进行处理,使处理后的图像比原图像清晰。
所需应用到的技术,包括:
a>对图片加噪声
b>选取中心区域
c>对选取的区域进行降噪处理
d>重新生成图像。
e>构造高斯低通滤波器时用到了高斯公式:exp(-(u^2+v^2)/(2*(D0^2)))
结果讨论:
以下是对不同的滤波器针对不同噪点处理的测试结果。
参考下面的试验结果,进行讨论:
A(011)是使用fspecial('gaussian’)平滑空域滤波处理效果,不过效果不是最好,由于最大程度降噪,导致图像模糊;
A(012)是频域滤波处理后的结果,因为使用了高斯低通滤波器,所以会有条黑线,处理一般;
A(021)是使用medfilt2()空域中值滤波器效果,降噪效果很不错,图像也很清晰;
A(022) 是频域滤波处理后的结果,同A(012),因为使用了高斯低通滤波器,所以会有条黑线,效果一般。
试验结果:
高斯加噪和椒盐加噪处理图分别如下:
如图:
图(A00):原图
图(A01):高斯加噪
图(A011):对图(A01)进行中心100*100空域滤波
图(A012):对图(A01)进行中心100*100频域滤波
(A0) (A01)
(A011) (A012)
如图:
图(A00):原图
图(A02):椒盐加噪
图(A021):对图(A02)进行中心100*100空域滤波
图(A022):对图(A02)进行中心100*100频域滤波
(A00) (A02)
(A021) (A022)
附录:
源代码1 :对高斯噪声的处理
f=imread('moon.tif');
J=imnoise(f,'gaussian',0.05,0.05);%添加高斯噪声
%空域滤波
r=[219 319 319 219];
c=[129 129 229 229];
BW=roipoly(J,c,r);
h=fspecial('gaussian',[5 5]);
A011=roifilt2(J,h,BW);
figure,imshow(A011);
%频域滤波
f1=imcrop(fn,[129 219 99 100]);
%截取100*100大小的窗口图片
f2=[255 255];
%建立一个新的图像
f2=uint8(f2);
f2=padarray(f2,[50 49],255);
%将新建图像拓展到100*100的黑色图片
f2=padarray(f2,[218 129],0);
%在新建图片周围添加白色使之大小为moon图片的大小
fn=fn-f2;
%得到中心100*100区域内为黑色的moon图片
PQ=paddedsize(size(f1));
[u,v]=dftuv(PQ(1),PQ(2));
D0=0.2*PQ(2);
hh=exp(-(u.^2+v.^2)/(2*(D0^2)));
%构造高斯低通滤波器
h1=dftfilt(f1,hh);
A012=padarray(h1,[218 129],0);
%将h1拓展到moon图片大小
A012=uint8(A012)+fn;
%得到中心100*100区域处理后的moon图片
figure,imshow(A012);
源代码2 :对椒盐噪声的处理
f=imread('moon.tif');
fn=imnoise(f,'salt & pepper',0.05);
%添加椒盐噪声
%空域滤波
f1=imcrop(fn,[129 219 99 100]);
%截取100*100大小的窗口图片
f2=[255 255];
%建立一个新的图像
f2=uint8(f2);
f2=padarray(f2,[50 49],255);
%将新建图像拓展到100*100的黑色图片
f2=padarray(f2,[218 129],0);
%在新建图片周围添加白色使之大小为moon图片的大小
fn=fn-f2;
%得到中心100*100区域内为黑色的moon图片
h=medfilt2(f1,'symmetric');
%对f1进行中值处理
A021=padarray(h,[218 129],0);
%将h拓展到moon图片大小
A021=A021+fn;
%得到中心100*100区域处理后的moon图片
figure,imshow(A021);
%频域滤波
f1=imcrop(fn,[129 219 99 100]);
%截取100*100大小的窗口图片
f2=[255 255];
%建立一个新的图像
f2=uint8(f2);
f2=padarray(f2,[50 49],255);
%将新建图像拓展到100*100的黑色图片
f2=padarray(f2,[218 129],0);
%在新建图片周围添加白色使之大小为moon图片的大小
fn=fn-f2;
%得到中心100*100区域内为黑色的moon图片
PQ=paddedsize(size(f1));
[u,v]=dftuv(PQ(1),PQ(2));
D0=0.1*PQ(2);
hh=exp(-(u.^2+v.^2)/(2*(D0^2)));%构造高斯低通滤波器
h1=dftfilt(f1,hh);
A022=padarray(h1,[218 129],0);
%将h1拓展到moon图片大小
A022=uint8(A022)+fn;
%得到中心100*100区域处理后的moon图片
figure,imshow(A022);
3):对加噪图像的中心区域(100*100)进行频域滤波,尽最大可能消除噪声。 技术描述: 对图像进行加高斯噪声和椒盐噪声处理;对包含高斯噪声和椒盐噪声的
ocr识别
英语词组翻译:“处置,处理 ”,“直到...才”
处置; deai with 直到。。。才 not...until
在许多语音,图像处理英文文献中会发现这个单词artifacts,请问这该...
翻译成图像缺陷好不
电涡流热成像无损检测图像处理技术 把这个翻译为英文的
Nondestructive Testing Detection of Image Processing Technology for Eddy-current Thermal Imaging
善问者如攻坚木先其易者后其节目翻译
善问者,如攻坚木,先其易者,后其节目意思是善于提问的人,就像加工处理坚硬的木材,先从容易处理的地方下手,然后对对节疤和纹理不顺的地方。出自:西汉·戴圣《礼记·学记》。原文:善学者,师逸而功倍,又从而庸之。不善学者,师勤而功半,又从而怨之。善问者如攻坚木,先其易者,后其节目,...
扫描仪的Twain 标准, WIA 标准是指什么?
TWAIN是一项重要的接口标准,为软件开发商和硬件设备生产厂商之间提供了一个统一的规范,以有效地避免系统及设备之间的不兼容问题。WIA,是Windows ImageAcquisition的缩写,可直接翻译为:Windows图像采集系统。这是windows XP加入的一个新功能,该功能主要包括了indowsXP对图像设备的支持以及对图像信息的处理...
数字图象处理dictionary什么意思
要获得一个数字图像必须将图像中的像素转换成数字信息,以便在计算器上进行处理和加工。将仿真图像转换成数字图像的工作,通常可由扫描仪来完成。扫描仪测量从图片发出或反射的光,依次记录光点的数值并产生一个彩色或黑白的数字拷贝。这个图像被翻译成一系列的数字后存储在计算器的硬盘上或者其它的电子介质...
翻译!英语翻译!本文以物理模拟技术、图像处理技术为基础,采用水模拟可 ...
本文以物理模拟技术、图像处理技术为基础,采用水模拟可视化技术,观察和记录液体充型过程的图像信息。Based on the physical simulation technology, image processing technology as the foundation, USES the water simulation visualization technology, observe and record the liquid filling process of image ...
礼记学记原文及翻译 礼记学记原文及翻译介绍
2、【译文】善于学习的人,老师费力小,而自己收到的效果却很大,这要归功于老师教导有方。不善于学习的人,老师费力大,而自己的获却很小,学生会因此埋怨老师。善于提问的人,就像加工处理坚硬的木材,先从容易处理的地方下手,然后对对节疤和纹理不顺的地方,时间长了,问题就愉快地解决了。不善于...
翻译下面英文 关于数字图像处理
在这个试验中,当我们使用邻域嵌入算法的时候,我们想要结合质量和特征点评估这种算法对高分辨图象的影响。根据弗里曼等人( 2002年)的观点,我们也尝试接近一个在本地信息(即规范亮度)和寻找相容的临近信息(即一阶梯度特征)之间的合理的加权因子。在pi和pj这两种小块之间距离的措施被定义为DistGrad1和...
图像处理的文献中,SIFT key的汉语意思是什么。大家能帮我翻译一下吗...
SIFT特征(Scale-invariant feature transform,尺度不变特征转换)
贾蚂欣美: Digital image processing
桓仁满族自治县18355099245: 计算机数字图像处理在生产生活等实践中的应用? - ?
贾蚂欣美: 制作平面广告,作平面设计.修改数码照片.
桓仁满族自治县18355099245: “图像处理”日语怎么说?? - ?
贾蚂欣美: 画像処理(がぞう しょり gazou syori)
桓仁满族自治县18355099245: 英语翻译这是一篇有关图像处理的文章,希望能在一周之内翻译出来,比较急,感激万分! - ?
贾蚂欣美:[答案] 给工人们送来烈酒, 并忘掉它. 把我们的父亲们窒息, 就像你就是它们. 当风展开 最后一个繁星的升起哈哈
桓仁满族自治县18355099245: 图像处理软件用英语怎么说 - ?
贾蚂欣美: 图像处理软件 image process software
桓仁满族自治县18355099245: 图像处理方面的专业英语翻译 (英译中) - ?
贾蚂欣美: 表示性涂抹方法representative-blobs method 指数型涂抹方法indexed-blobs method
桓仁满族自治县18355099245: 人工智能应用 ?
贾蚂欣美: 人工智能的实际应用包括:1、人脸识别2、机器翻译3、文本编辑器或自动更正4、搜索和推荐算法5、聊天机器人6、数字助理7、社交媒体1、人脸识别 人脸识别也称人像...
桓仁满族自治县18355099245: video - registration在图像处理术语中该怎么翻译? - ?
贾蚂欣美: 影像对齐/定位
桓仁满族自治县18355099245: 图像处理中,metric reconstruction 和 metric rectification如何翻译?尤其是metric这个词.?
贾蚂欣美: metric reconstruction 度量重建 metric rectification公制整改 metric 公制