问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求助VB高手!!有关图象锐化的问题

发布网友 发布时间:2022-05-01 17:49

我来回答

2个回答

热心网友 时间:2022-06-20 14:07

事实上有大量的边缘提取算法,这里介绍几种常用的比较简单的边缘提取算法.其实边缘提取算法也可以算是图像二值化算法,只是更突出图像中拐点的地方.

图像边缘的种类可以分为两种:一种称为阶跃性边缘,它两边像素的灰度值有着显著的不同;另一种称为屋顶状边缘,它位于灰度值从增加到减少的变化转折点。对于阶跃性边缘,二阶方向导数在边缘处呈零交叉;而对于屋顶状边缘,二阶导数在边缘处取极值。 通常的边缘提取方法是先通过边缘算子找到图像中可能的边缘点,再把这些点连接起来形成封闭的边界。 边缘检测困难在于物体之间相接触、互遮挡或者由于噪声等原因引起的边缘间断。

其中susan和canny算法我用过,可以结合两种算法的结果使用...

1.susan算子
SUSAN算子是一种基于图像局部灰度特征的算法,利用一个圆形的模板对图像进行扫描,比较模板内部的点与模板中心点的灰度值,如果灰度差值小于一定的阈值,就认为该点与中心点的灰度相同。统计模板内部与中心点灰度相同的点的个数,与一个阈值进行比较,判断该点是否属于某个区域的边缘点,从而实现对图像的分割。
//-----------------------------------------------------------------------
//c/c++描述
/**************************************************
SUSAN边缘检测
parameter: HDIB
return: HDIB
**************************************************/
HDIB SUSANEdgeDetectDIB(HDIB hDib){
SetCursor(LoadCursor(NULL, IDC_WAIT));

DWORD dwDataLength = GlobalSize(hDib);
HDIB hNewDib = GlobalAlloc(GHND,dwDataLength);
if(!hNewDib){
SetCursor(LoadCursor(NULL, IDC_ARROW));
return NULL;
}
LPBYTE lpDIB = (LPBYTE)GlobalLock(hNewDib);
if(lpDIB == NULL){
SetCursor(LoadCursor(NULL, IDC_ARROW));
return NULL;
}

LPBYTE lpDIBSrc = (LPBYTE)GlobalLock(hDib);

memcpy(lpDIB, lpDIBSrc,
sizeof(BITMAPINFOHEADER)+PaletteSize(lpDIBSrc));

DWORD lSrcWidth = DIBWidth(lpDIBSrc);
DWORD lSrcHeight = DIBHeight(lpDIBSrc);
WORD wBitCount = ((LPBITMAPINFOHEADER)lpDIBSrc)->biBitCount;
DWORD lSrcRowBytes = WIDTHBYTES(lSrcWidth*((DWORD)wBitCount));
LPBYTE lpOldBits = FindDIBBits(lpDIBSrc);
LPBYTE lpData = FindDIBBits(lpDIB);

//图像变换开始//////////////////////////////////////////
DWORD i, j, h, k, offset;
int NearPoint[37];
int OffSetX[37] = { -1, 0, 1,
-2,-1, 0, 1, 2,
-3,-2,-1, 0, 1, 2, 3,
-3,-2,-1, 0, 1, 2, 3,
-3,-2,-1, 0, 1, 2, 3,
-2,-1, 0, 1, 2,
-1, 0, 1 };
int OffSetY[37] = { -3,-3,-3,
-2,-2,-2,-2,-2,
-1,-1,-1,-1,-1,-1,-1,
0, 0, 0, 0, 0, 0, 0,
1, 1, 1, 1, 1, 1, 1,
2, 2, 2, 2, 2,
3, 3, 3 };

if(wBitCount == 8){
int thre, same, max, min;

//统计象素亮度最大值和最小值
max = min = 0;
for(i=0;i<lSrcHeight;i++)
for(j=0;j<lSrcWidth;j++){
offset = lSrcRowBytes*i+j;
if(max < (int)(*(lpOldBits+offset)))
max = (int)(*(lpOldBits+offset));
if(min > (int)(*(lpOldBits+offset)))
min = (int)(*(lpOldBits+offset));
}

//相似度阈值为最大值和最小值差的1/10
thre = (max-min)/10;

for(i=3;i<lSrcHeight-3;i++)
for(j=3;j<lSrcWidth-3;j++){
//统计圆形邻域内相似的点的个数
same = 0;
for(h=0;h<37;h++)
NearPoint[h] = (int)(*(lpOldBits+lSrcRowBytes*(i+OffSetY[h])+(j+OffSetX[h])));
for(h=0;h<37;h++)
if(((int)abs(NearPoint[h]-NearPoint[18])) <= thre) same ++;

if(same > 27)
*(lpData+lSrcRowBytes*i+j) = 255;
else *(lpData+lSrcRowBytes*i+j) = 0;
}
}

if(wBitCount == 24){
int theSame[3], theMax[3], theMin[3], theThre[3];

memset(theMax, 0, sizeof(int)*3);
memset(theMin, 0, sizeof(int)*3);
for(i=0;i<lSrcHeight;i++)
for(j=0;j<lSrcWidth;j++){
offset = lSrcRowBytes*i+j*3;
for(k=0;k<3;k++){
if(theMax[k] < (int)(*(lpOldBits+offset+k)))
theMax[k] = (int)(*(lpOldBits+offset+k));
if(theMin[k] > (int)(*(lpOldBits+offset+k)))
theMin[k] = (int)(*(lpOldBits+offset+k));
}
}

for(k=0;k<3;k++)
theThre[k] = (theMax[k]-theMin[k])/10;

for(i=3;i<lSrcHeight-3;i++)
for(j=3;j<lSrcWidth-3;j++){
memset(theSame, 0, sizeof(int)*3);
for(k=0;k<3;k++){
for(h=0;h<37;h++)
NearPoint[h] = (int)(*(lpOldBits+lSrcRowBytes*(i+OffSetY[h])+(j+OffSetX[h])*3+k));
for(h=0;h<37;h++)
if(((int)abs(NearPoint[h]-NearPoint[18])) <= theThre[k]) theSame[k] ++;
}

if((theSame[0] > 27) && (theSame[1] > 27) && (theSame[2] > 27))
memset(lpData+lSrcRowBytes*i+j*3, 255, 3);
else
memset(lpData+lSrcRowBytes*i+j*3, 0, 3);
}
}

GlobalUnlock(hDib);
GlobalUnlock(hNewDib);
SetCursor(LoadCursor(NULL, IDC_ARROW));

return hNewDib;
}

2.canny算子
Canny边缘检测基本原理
(1)图象边缘检测必须满足两个条件:一能有效地抑制噪声;二必须尽量精确确定边缘的位置。
(2)根据对信噪比与定位乘积进行测度,得到最优化*近算子。这就是Canny边缘检测算子。
(3)类似与Marr(LoG)边缘检测方法,也属于先平滑后求导数的方法。

算法比较内容比较多,有需要的朋友可以到这儿看(http://www.pcdog.com/e/develop-tools/2005/08/f067918.html).

3.sobel算子

Sobel 算子有两个,一个是检测水平边沿的 ;另一个是检测垂直平边沿的 。与 和 相比,Sobel算子对于象素的位置的影响做了加权,因此效果更好。
Sobel算子另一种形式是各向同性Sobel(Isotropic Sobel)算子,也有两个,一个是检测水平边沿的 ,另一个是检测垂直平边沿的。各向同性Sobel算子和普通Sobel算子相比,它的位置加权系数更为准确,在检测不同方向的边沿时梯度的幅度一致。由于建筑物图像的特殊性,我们可以发现,处理该类型图像轮廓时,并不需要对梯度方向进行运算,所以程序并没有给出各向同性Sobel算子的处理方法。
由于Sobel算子是滤波算子的形式,用于提取边缘,可以利用快速卷积函数,简单有效,因此应用广泛。美中不足的是,Sobel算子并没有将图像的主体与背景严格地区分开来,换言之就是Sobel算子没有基于图像灰度进行处理,由于Sobel算子没有严格地模拟人的视觉生理特征,所以提取的图像轮廓有时并不能令人满意。 在观测一幅图像的时候,我们往往首先注意的是图像与背景不同的部分,正是这个部分将主体突出显示,基于该理论,我们给出了下面阈值化轮廓提取算法,该算法已在数学上证明当像素点满足正态分布时所求解是最优的。

/// <summary>
/// 按 Sobel 算子进行边缘检测
/// </summary>
/// <param name="b">位图流</param>
/// <returns></returns>
public Bitmap Sobel(Bitmap b)
{
Matrix3x3 m = new Matrix3x3();

// -1 -2 -1
// 0 0 0
// 1 2 1
m.Init(0);
m.TopLeft = m.TopRight = -1;
m.BottomLeft = m.BottomRight = 1;
m.TopMid = -2;
m.BottomMid = 2;
Bitmap b1 = m.Convolute((Bitmap)b.Clone());

// -1 0 1
// -2 0 2
// -1 0 1
m.Init(0);
m.TopLeft = m.BottomLeft = -1;
m.TopRight = m.BottomRight = 1;
m.MidLeft = -2;
m.MidRight = 2;
Bitmap b2 = m.Convolute((Bitmap)b.Clone());

// 0 1 2
// -1 0 1
// -2 -1 0
m.Init(0);
m.TopMid = m.MidRight = 1;
m.MidLeft = m.BottomMid = -1;
m.TopRight = 2;
m.BottomLeft = -2;
Bitmap b3 = m.Convolute((Bitmap)b.Clone());

// -2 -1 0
// -1 0 1
// 0 1 2
m.Init(0);
m.TopMid = m.MidLeft = -1;
m.MidRight = m.BottomMid = 1;
m.TopLeft = -2;
m.BottomRight = 2;
Bitmap b4 = m.Convolute((Bitmap)b.Clone());

// 梯度运算
b = Gradient(Gradient(b1, b2), Gradient(b3, b4));

b1.Dispose(); b2.Dispose(); b3.Dispose(); b4.Dispose();

return b;
} // end of Sobel

4.还有Laplace,Gobar,Roberts等等... 没有详细了解过,也不介绍了.

热心网友 时间:2022-06-20 14:07

你想用VB还是VB.NET呢?VB.NET相对于VB几乎是一门新的语言。
对图像处理的算法《电脑编程与维护》2008年又几期有这方面文章,到他们网站可以下论文配的程序,都是保证能正确执行的。
你需要设计成什么样的界面,看我能做到不。
可以再交流。

参考资料:个人感觉

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
豆瓣酱放多了怎么补救 鑫创sssbd量产工具 为了了解某校1500名学生的体质状况,随机调查了这个学校内一定数量学生... 564÷85的竖式如何列? 上海房屋过户 要准备什么资料 个人卖房要提供哪些资料 房屋交易资料需要哪些 房子买卖要哪些资料 房产交易需要什么资料 ...让重锤自由下落,打出的一条纸带如图所示,图中 ios怎么用手柄玩游戏 谁知道清明节的日期、来源、习俗? 这题二阶偏导和为0说明有驻点? 二阶混合偏导数的几何意义? 清明节的时间清明节的时间风俗和习惯文化意义 图像处理中什么是屋顶变化 清明节的习俗以及时间? 我未达到16周岁,可以完成支付宝实名制认证吗 100分!如何求二元函数的二阶方向导数?? 未成年支付宝限额多少支付宝怎么实名啊我未成年没有身份证 支付宝未满16岁实名认证 未满16岁能实名认证支付宝吗? 支付宝的16岁实名认证 我支付宝身份信息才17岁就可以实名认证,怎么回事? 现在支付宝满16岁不满18岁能不能实名认证 电表箱总闸总是跳闸,怎么办? 如果屋子里面多久没有人住需要关闭电表总闸? 电表上的闸关掉有什么影响 德力西电表为啥关了总闸还有电? SQL数据库操作问题 高数。刚结束的2017年的考试考了“二阶偏导数”和方向导数。2018年还会考吗?大神有什么预测? 智力玩具解法 考研高数二考方向导数与梯度吗? 16岁能通过支付宝的实名制注册吗 水平方向导数 16周岁可以支付宝实名认证吗 截,保时捷,难要怎么接? 微信小易信服号可以查网贷吗 面粉是纯小麦粉吗? 自己查的网贷信用报告和贷款机构查询的是一样的吗? Sql数据库操作的问题 biside什么意思中文翻译 beside是什么意思? beside什么意思中文 beside是什么意思 beSide是什么意思?&#xF613; beside是什么意思及反义词 beside是什么意思啊!!! beside 意思是什么 beside什么意思?