图像的逻辑运算:
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; }