如何删除图像的边缘像素

escaper 2009-11-30 06:54:25
如何删除图像的边缘像素,

我有一张图像, 图像中间是一个不规则图形, 这个不规则图形内的所有像素的灰度值是固定的,其它地方都是白色的,

请问有什么比较好的方法能够快速找到这个不规则图形的边缘,并且将其删除吗?

(注:注意是不规则图形,故不能简单采用二分法找边缘点,因为这个功能会被很多循环调用,所以对速度要求高了点)

能给几行代码看看吗?
...全文
463 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
wuhuwy 2009-12-01
  • 打赏
  • 举报
回复
帮顶一下!
shuilongyin_00 2009-12-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 escaper 的回复:]
对于第一种方法, 原始顶点周围的八个像素中, 有可能有多个像素都是在原多边形区域内的,也就是说可能有多个像素点的值都是固定值得. 而且还要考虑到内多边形和外多边形的区别. 另外两个顶点的斜率在小于45度的时候,也有特殊情况出现,所以还在寻找一个能统一判定的方案.

关于第二种方法我还在看,不过看起来并不比逐行扫描更快速
[/Quote]

考虑到内多边形和外多边形的区别,上、下、左、右 移动一像素后判断……
这就是在确定内凹还是外凸。

你可以参考下:这只是个人意见,不确定能达到效果!

数字图像处理 (冈萨雷斯)

还有,对于图片的点、线处理,基本是用循环的,单像素处理!
zhouzhipen 2009-12-01
  • 打赏
  • 举报
回复
32位图形线形扫描的汇编代码
函数从类中提取出来的,有些部分需要修改

void DrawEdge(COLORREF Color)//Color=你要删除的颜色
{
if( BeginDraw() )
{
COLORREF* pDest=((COLORREF*)(m_GraphBuffer+m_Pitch+1));
COLORREF Key_Color=m_DrawColor.dwColorSpaceLowValue;
int srcw=m_Desc.dwWidth-1;
int srch=m_Desc.dwHeight-1;
int Pitch=m_Desc.lPitch;

for(int j=0;j<srch;j++)
{
__asm
{
mov edi,srcw;
mov esi,Color;
mov ebx,dword ptr [pDest];//装入pDest
mov ecx,Key_Color;//装入Color
xor edx,edx;
cmp edx,srcw;
jc STLOOP;
jmp ENDLOOP;
STLOOP:
cmp [ebx],ecx;
je LBEND;
cmp ecx,[ebx+4];
je LBOUT;
cmp [ebx-4],ecx;
je LBOUT;
mov eax,ebx
add eax,Pitch;
cmp [eax],ecx;
je LBOUT;
mov eax,ebx
sub eax,Pitch;
cmp [eax],ecx;
je LBOUT;
jmp LBEND;
LBOUT:
mov dword ptr[ebx],esi;
LBEND:
add ebx,4;

inc edx;
cmp edx,edi;
jc STLOOP;
jmp ENDLOOP;
ENDLOOP:
mov pDest,ebx;
}
}
EndDraw();
}
}
leechrockgames 2009-11-30
  • 打赏
  • 举报
回复
最好用bmp图像,然后访问其像素值.就可以了.
escaper 2009-11-30
  • 打赏
  • 举报
回复
to 小破孩带枪拜访

对于第一种方法, 原始顶点周围的八个像素中, 有可能有多个像素都是在原多边形区域内的,也就是说可能有多个像素点的值都是固定值得. 而且还要考虑到内多边形和外多边形的区别. 另外两个顶点的斜率在小于45度的时候,也有特殊情况出现,所以还在寻找一个能统一判定的方案.

关于第二种方法我还在看,不过看起来并不比逐行扫描更快速
shuilongyin_00 2009-11-30
  • 打赏
  • 举报
回复
用第一种方法,第二次的时候能不能将原始的点,都向上、下、左、右 移动后判断->移动到的点现在的灰度是

否是255 若是255 则该坐标无效 若等于固定灰度值,则记录该坐标,成为新的顶点坐标,再按照一做下!

这只是个人意见,不确定能完成!
shuilongyin_00 2009-11-30
  • 打赏
  • 举报
回复
参考
http://hi.baidu.com/%CD%BC%CF%F1%D1%A7%CF%B0%BB%FD%C0%DB%B1%CA%BC%C7/blog/item/375bb8ce39a49d37f8dc61b1.html Matlab的程序

http://hi.baidu.com/liujianz/blog/item/af3818cfa461c238f8dc61d5.html
escaper 2009-11-30
  • 打赏
  • 举报
回复
to 小破孩带枪拜访

我目前正在使用你说的第一种方法,可以这样带来一个问题,就是说我再次进行删除边缘的时候有些麻烦,
我将顶点连成的线段删除后,在循环中还需要再次对图像进行删除边缘像素, 这样的话,我还没有找到一个比较好的方法来判断新的顶点.

关于你说的第二种方法,我还不太了解,能否说的更详细些
shuilongyin_00 2009-11-30
  • 打赏
  • 举报
回复
顶点都知道了,就两点连接成一条线段,把这线段删除能行吗!

或者
灰度值固定,用3×3的模板进行均值滤波,再找出灰度值为 固定灰度+255(白色)的值一半 的点,删除掉。

如果固定灰度为254的话,那就均值时4舍5入!

不知道这样能行不?
escaper 2009-11-30
  • 打赏
  • 举报
回复
另外一点补充, 这个不规则多边形是我随意用鼠标画的,就是说我已经知道这个不规则多边形的各个角顶点

19,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧