图像像素逻辑化

逻辑运算包括与、或、非、异或等,在二进制图像中可以直接进行计算,但是在像素范围为0-255的图像中,必须将像素转换为二进制的八位,及0=0000,0000,255=1111,1111,然后按位进行计算。

函数实现

  1. bitwise_not(src,dst)
  2. bitwise_and(src1,stc2,dst)
  3. bitwise_or(src1,stc2,dst)
  4. 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;
}

结果展示:

opencv将二值化图片取反 opencv图片转二进制_opencv将二值化图片取反

自适应阈值二值化

对于局部受光的图像进行全局阈值,可能会出现“无论设置什么阈值参数,都无法满足全图要求”的尴尬。所有才有了自适应阈值

#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;
}

opencv将二值化图片取反 opencv图片转二进制_opencv将二值化图片取反_02