膨胀
我们再看这个‘识’字,门槛值在54,门槛值在80,门槛值在104,门槛值在154,如下:
对比前一篇,门槛值在204,门槛值在254,
从视觉来看,我们最想要的‘识’字在门槛值154附近(热起来,冷会褪去,冷起来,热会褪去,不冷不热,和的位置,不卑不亢,恰到好处)。
实质,我们取像,调焦的过程,也是这样,当差分和最大时,图像最清楚,我们再看看那时的图片:
图像最清楚,正对应我们门槛值154附近的‘识’字,假定这是我们的正常状态,而我们的人眼,并不需要计算什么差分和,也能看个八九不离十,这种正常状态,这实质就是高斯分布阴阳黑白此消彼长在我们的眼睛里作怪,就像黑夜白天,一年四季,硬件已经保证了,在以高斯分布运作,你知不知道,他都在(眼睛晶状体的形状,以及聚焦处清楚相关,于非聚焦处模糊相关)。
假定这种正常状态也反映了我们身体状况的正常状态,其他状态我们定义为病态,我们是否可以通过高斯分布阴阳黑白此消彼长的方法从病态返回正常状态呢?答案是显然的。身体本身就具有返回正常状态的能耐,你用这种黑白大法和身体自身用这种黑白大法,显然是两码事,但结果会一致的趋同。身体用黑白大法,你无能为力,所以我们只谈你用的这种黑白大法:
1,不清楚,就是病态,显然手动调焦可以做到,再如带眼镜,再就是激光准分子技术。
2,不清楚,就是病态,动态连续使用门槛值黑白大法,确定最佳门槛值。
3,其实我们前篇还有方法,略去......
不清楚,就是病态,下面我们谈一下可量化的黑白大法,本篇我突出的重点,指的是形态学里边膨胀腐蚀用的结构元素,这个结构元素,千变万化,你可以自定义,如果我们和中医思想对等,对焦清晰(这里用形态学里边膨胀腐蚀达到目的)为和,即治愈,那么结构元素可以称为千变万化的中药方。
一直想对形态学一探究竟,终于等来了机会,今天就浅尝一下,我们先看一下效果,连续腐蚀了三次,却膨胀了:
不知其要,上下求索(找bug),最后我明白了,如果你认为是腐蚀背景就对了。
抄程序,抄明白,也很费功夫,我参考了左飞的图像处理形态学一章的程序,他是vc++的,我整成了c#,其实这都不是关键,关键是,知其要,一言以蔽之。所以要把他改成腐蚀这个‘识’,也自然就通透了。以下是代码:
第一,从原图像截取roi图像:
if (Mabmp == null) { return; }//加载的位图文件,Ma_orgImg数组buffer是像素
int H = Mabmp.Height;//位图文件的高
int W = Mabmp.Width;//位图文件的宽
_RoiW = Convert.ToInt32(textBoxW.Text);
int mod = _RoiW % 4;//解决四位对齐问题20150716
_RoiW = _RoiW + (4 - mod) % 4;
_RoiH = Convert.ToInt32(textBoxH.Text);
_RoiX = Convert.ToInt32(textBoxX.Text);//感兴趣区域图像的矩形左顶(ROIX,Y)高宽(roiW,H)
_RoiY = Convert.ToInt32(textBoxY.Text);
tempImage3 = new byte[_RoiW * _RoiH];//cutroi截取的感兴趣图像
// unsafe
{
for (int i = 0; i < _RoiH; i++)
for (int j = 0; j < _RoiW; j++)
{
tempImage3[i * _RoiW + j] = Ma_orgImg[((i + _RoiY) * W + j + _RoiX)];
}
m_btempImage3 = true;
}
第二,截取图像二值化:
int binthreshold = Convert.ToInt32(textBoxBIN.Text);
clonetempbuffer8= new byte[_RoiH * _RoiW];
tempbuffer8 = new byte[_RoiH * _RoiW];
for (int i = 0; i < _RoiH; i++)
for (int j = 0; j < _RoiW; j++)
{
int ii = i * _RoiW + j;
clonetempbuffer8= tempbuffer8[ii] = (tempImage3[ii] >= (byte)binthreshold ? (byte)255 : (byte)0);
}
三,第一次腐蚀://我截取图像是200*200的,因为是测试,就直接用了
int[] 模板=new int[3*3];
模板[0]=1; 模板[1]=1; 模板[2]=1;
模板[3]=1; 模板[4]=1; 模板[5]=1;
模板[6]=1; 模板[7]=1; 模板[8]=1;
byte[] temp = new byte[200 * 200];
for (int i = 0; i < 40000; i++)
{
//temp[i]= (clonetempbuffer8[i]==255)?(byte)0:(byte)255;//这一句话实现对‘识’字腐蚀
temp[i] = (clonetempbuffer8[i] == 0) ? (byte)0 : (byte)255;//这一句话实现对背景腐蚀
}
for (int y = 3 / 2; y < 200 - 3 / 2; y++)
{
for (int x = 3 / 2; x < 200 - 3 / 2; x++)
{
if (模板在当前位置重合(temp, x, y, 模板, 3, 200))
{
int tempN = y * 200 + x;
腐蚀后图像[tempN] = temp[tempN];
}
}
}
//调用函数代码:
private bool 模板在当前位置重合(byte[] 腐蚀原图像,int x,int y,int[] muban,int mubanW,int imgW)
{
int K = 100;
int i = 0;
int j = 0;
x -= mubanW / 2;
y -= mubanW / 2;
for (; i < mubanW; i++)
for (; j < mubanW; j++)
{
if (muban[i * mubanW + j] * (int)腐蚀原图像[(y + i) * imgW + x + j]< K)
{
return false;
}
}
return true;
}
四,后面的重复腐蚀与三同,不再重复。
所以这个结构元素(治病药方),我们用了3*3的一种,正方向,到达病态,逆方向,治病,返回清晰,常态,知道和为常,知道常为明,浅尝辄止,见好就收,呵呵!。