图像像素逻辑化
逻辑运算包括与、或、非、异或等,在二进制图像中可以直接进行计算,但是在像素范围为0-255的图像中,必须将像素转换为二进制的八位,及0=0000,0000,255=1111,1111,然后按位进行计算。
函数实现
- bitwise_not(src,dst)
- bitwise_and(src1,stc2,dst)
- bitwise_or(src1,stc2,dst)
- bitwise_xor(src1,stc2,dst)
代码实现
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat a = (Mat_<uchar>(1, 2) << 0, 5);
Mat b = (Mat_<uchar>(1, 2) << 0, 6);
Mat not_a, or_ab, and_ab, xor_ab;
bitwise_not(a, not_a);
bitwise_and(a, b, and_ab);
bitwise_or(a, b, or_ab);
bitwise_xor(a, b, xor_ab);
cout << not_a << endl;
cout << and_ab << endl;
cout << or_ab << endl;
cout << xor_ab << endl;
return 0;
}
图像二值化
图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。二值图像每个像素只有两种取值:要么纯黑,要么纯白。
固定阈值二值化
固定阈值二值化:是指对整个图像中的每一个像素都选用相同的阈值。当图像的目标颜色差别比较大的时候,选择两个波峰之间的波谷作为阈值,就能轻松地把这两类像素分开。但是图像的直方图往往是不连续的,有非常多尖峰和抖动,要找到准确的极值点十分困难。日本工程师大津展之为这个波谷找到了一个合适的数学表达,并于1979年发表[2]。这个二值化方法称为大津算法(Otsu’s method)。大津算法类似于一维Fisher判别分析的离散化模拟。通过穷举法找到一个阈值数字,把这些像素切成两类,使得这两类像素的亮度的类内方差最小。类内方差指的是两类像素的方差的加权和,这里权指的是这类像素点数量占整个图像像素点数量的比值。
opencv提供了函数进行实现:
threshold(src, thresh, maxval, type);
第一个参数 src 指原图像,原图像应该是灰度图。
第二个参数 thresh 指用来对像素值进行分类的阈值。
第三个参数 maxval 指当像素值高于(有时是小于)阈值时应该被赋予的新的像素值。
第四个参数 type 指不同的阈值方法。
代码实现车牌识别
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat str = imread("C:/Users/lenovo/Pictures/车牌.jpeg");
Mat gray;
cvtColor(str, gray, COLOR_RGB2GRAY);
Mat thres;
threshold(str, thres, 100, 255, THRESH_BINARY);
imshow("原图", str);
imshow("二值化", thres);
waitKey(0);
destroyAllWindows();
return 0;
}
结果展示:
自适应阈值二值化
对于局部受光的图像进行全局阈值,可能会出现“无论设置什么阈值参数,都无法满足全图要求”的尴尬。所有才有了自适应阈值
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
Mat str = imread("C:/Users/lenovo/Pictures/车牌.jpeg");
Mat gray;
cvtColor(str, gray, COLOR_RGB2GRAY);
Mat thres;
threshold(str, thres, 100, 255, THRESH_BINARY);
imshow("原图", str);
imshow("二值化", thres);
Mat adaptive_mean, adaptive_gauss;
adaptiveThreshold(gray, adaptive_mean, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 55, 0 );
adaptiveThreshold(gray, adaptive_gauss, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 55, 0 );
imshow("均值阈值化", adaptive_mean);
imshow("高斯阈值化", adaptive_gauss);
waitKey(0);
destroyAllWindows();
return 0;
}