图像点运算:只改变图像的像素值,不改变图像像素点之间的几何关系。
这就是与图像几何操作的区别了。
转回正题。点运算的理论公式是这样子的:Y=aX+b。Y:新像素值;X:旧像素值;a:变换比例常数;b:常数。
注意一个问题就是 不要让数据溢出。
讨论a,b的值得情况:
a=1,b=0,像素值不变,即复制图像;b!=0,所以像素值整体上移或下移,表现的结果系图像变亮或者变暗。
a>1,对比度拉伸
a<1,对比度压缩
a<0,图像求补运算。这里要适当选择b值,因为aX<0,明显不行啦是吧。
觉得求补运算比较有意思,所以写出来看看效果。
贴上关键代码,a取-1,b取255.
for(j=0;j<Hang;j++)
{
for(i=0;i<Lie;i++)
{
int tempR,tempG,tempB;
tempB=buffer[j*Lie*BytesPerPixel+i*BytesPerPixel+0];
tempG=buffer[j*Lie*BytesPerPixel+i*BytesPerPixel+1];
tempR=buffer[j*Lie*BytesPerPixel+i*BytesPerPixel+2];
// temp=(tempR+tempG+tempB)/3;
// temp=a*temp+b;
// pDC->SetPixel(i,j,RGB(temp,temp,temp));
tempB=a*tempB+b;
tempG=a*tempG+b;
tempR=a*tempR+b;
pDC->SetPixel(i,j,RGB(tempR,tempG,tempB));
}
}
上图看看效果先:
这是真彩色图像的求补。黑白图像的求补也是很同样道理。
这里提下点运算还可以完成什么操作,
1,阈值化:非常重要,当然也很简单,大于阈值的赋255,小于的赋0。阈值的选取利用图像的频率分布直方图。
2,对比度拉伸(包括分段对比度打算):对0~255整个区域(或者感兴趣的部分区域)利用aX+b进行转换,目的令使用者更容易区分感兴趣的信息。(图像反色也属这个吧)
3,画出轮廓线:这个比较复杂,简单说说工作流程就是先对图像二值化处理,再进行边缘算子检测,再通过4连通或者8连通的方式进行轮廓的提取,最后通过记录起始坐标和连通方向使图像的信息量大大简化,加快处理速度。