个人博客:http://www.chenjianqu.com/
原文链接:http://www.chenjianqu.com/show-39.html
图像的逻辑运算:
1. 对图像求反
对于黑白图像来说,黑变白 百变黑,对于灰度图像来说,将255减去原像素值即为求反。
应用:
(1) 求取图像的阴影面积
(2) 求取图像的补图像
代码实现如下:
//非运算
Mat NotOperation(Mat& src)
{
return LinearPointOperation(src, -1, 255);
}
2. 与运算
当两个图像对应的像素同时为真时,结果为真。
应用: 主要用于求两幅二值图像的相交部分。
代码实现:
Mat AndOperation(Mat& src1, Mat& src2)
{
Mat dst(src1.rows, src1.cols, src1.type(), Scalar(0));
if (src1.channels() == 1 && src2.channels() == 1) {
for (int i = 0; i < src1.rows; i++) {
uchar *src1Row = src1.ptr(i);
uchar *src2Row = src2.ptr(i);
uchar *dstRow = dst.ptr(i);
for (int j = 0; j < src1.cols; j++)
{
if (src1Row[j] > 122 && src2Row[j] > 122)
dstRow[j] = 255;
else
dstRow[j] = 0;
}
}
}
return dst;
}
3. 或运算
当两个图像对应的像素有一个为真时,结果为真。
应用:主要用于求两幅二值图像的合并。
代码实现如下:
Mat OrOperation(Mat& src1, Mat& src2)
{
Mat dst(src1.rows, src1.cols, src1.type(), Scalar(0));
if (src1.channels() == 1 && src2.channels() == 1) {
for (int i = 0; i < src1.rows; i++) {
uchar *src1Row = src1.ptr(i);
uchar *src2Row = src2.ptr(i);
uchar *dstRow = dst.ptr(i);
for (int j = 0; j < src1.cols; j++)
{
if (src1Row[j] > 122 || src2Row[j] > 122)
dstRow[j] = 255;
else
dstRow[j] = 0;
}
}
}
return dst;
}
4. 异或运算
当两个图像对应的像素相同时,结果为真;反之为假。
应用:
(1) 得到两幅图像中不想交的部分
(2) 绘制区别于背景的,可恢复的图像
代码实现:
Mat XorOperation(Mat& src1, Mat& src2)
{
Mat dst(src1.rows, src1.cols, src1.type(), Scalar(0));
if (src1.channels() == 1 && src2.channels() == 1) {
for (int i = 0; i < src1.rows; i++) {
uchar *src1Row = src1.ptr(i);
uchar *src2Row = src2.ptr(i);
uchar *dstRow = dst.ptr(i);
for (int j = 0; j < src1.cols; j++)
{
if (src1Row[j] ==src2Row[j])
dstRow[j] = 0;
else
dstRow[j] = 255;
}
}
}
return dst;
}