图像的二值化处理
图像二值化,就是根据阈值把图像中的颜色转为黑/白两种
二值化过程
二值化过程的伪代码描述如下
for (;it != itend;it++, itout++) {
if (get_ColorToTargetDistance(colorx) <= _distance) {
*itout = 0;
}
else {
*itout = 255;
}
}
其中it
是源图片的迭代器,itout
是二值化结果容器的迭代器;
get_ColorToTargetDistance()
用于获取颜色和阈值的差距;
两个三通道的颜色之间的差距大小可用下列式子计算:
distance =
abs(color1[0] - color2[0]) +
abs(color1[1] - color2[1]) +
abs(color1[2] - color2[2]);
如果图片中的颜色处在阈值附近,就修改为0;否则修改为255;
处理结果如下:
直接上代码:
二值化处理类ColorDetector
/* ColorDetector
@brief: 用于二值化处理
@member function:
>
>
>
>
*/
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using std::vector;
using namespace cv;
class ColorDetector {
public:
/* 构造函数 */
ColorDetector() :
_distance(0)
{
};
/* 析构函数 */
~ColorDetector() {
};
/* 二值化处理 */
inline cv::Mat process(cv::Mat& image) {
_result.create(image.size(), CV_8U);
auto it = image.begin<cv::Vec3b>();
auto itend = image.end<cv::Vec3b>();
auto itout = _result.begin<uchar>();
std::vector<int> colorx(5);
for (;it != itend;it++, itout++) {
colorx[0] = it[0][0];
colorx[1] = it[0][1];
colorx[2] = it[0][2];
if (get_ColorToTargetDistance(colorx) <= _distance) {
*itout = 0;
}
else {
*itout = 255;
}
}
return _result;
};
/* 设置各通道阈值 */
inline void setTargetColor(const int blue, const int red, const int green) {
_target = std::vector<int>{ blue,red,green };
};
/* 设置公差 */
inline void setColorDistanceThreshold(int distance) {
_distance = (distance > 0) ? distance : 0;
};
/* 获取公差 */
inline int get_Distance() {
return _distance;
};
/* 获取颜色到阈值的城区距离 */
inline int get_ColorToTargetDistance(std::vector<int>& color) {
return get_ColorDistance(_target, color);
}
/* 获取颜色的城区距离 */
inline int get_ColorDistance(std::vector<int>& color1, std::vector<int>& color2) {
return abs(color1[0] - color2[0]) + abs(color1[1] - color2[1]) + abs(color1[2] - color2[2]);
}
private:
vector<int> _target;/* 阈值 */
int _distance;/* 公差 */
cv::Mat _result;/* 二值化处理结果 */
};
调用程序
int main()
{
Mat imga = imread("D:\\cat.jpg");
ColorDetector cdetector;
/* 设置阈值 */
cdetector.setTargetColor(50,50,50);
/* 设置公差 */
cdetector.setColorDistanceThreshold(150);
/* 二值化处理 */
cv::Mat result = cdetector.process(imga);
imshow("src", imga);;
imshow("zhc", result);;
waitKey(0);
}