前言
对于可用颜色较少的系统,可以以牺牲分辨率为代价,通过颜色值的抖动来增加可用颜色数量。通俗来说,假如一个灰色图像,有256个灰阶,灰度值范围是0-255。现在只能使用两个灰阶0(黑色)和255(白色)去显示这个灰色图像,那怎么办呢?结论就是通过图像的“抖动”来实现。灰色图像中越黑的地方,周围的像素用0密集排布,越白的地方,黑色像素点越稀疏。通过对黑色像素点的稀疏或者密集去体现不同的灰阶(核心思想)。下面就讨论两种图像抖动算法,一个是Ordered,一个是floydSteinberg。
一、源代码
1、首先定义一个type头文件,存放一些自定义的参数类型。Type.h文件代码如下:
#ifndef DITHERING_TYPE_H
#define DITHERING_TYPE_H
namespace dither
{
//Ordered图像抖动算法Map类型。
enum MAP_TYPE
{
bayer_2x2,
bayer_4x4,
bayer_8x8,
clustered_3x3_1,
clustered_3x3_2
};
struct GRAY_IMAGE_PARAM
{
int edge_number; //边缘段数
double dpi; //pix/inch
double image_height; //图片高度(单位mm)
double image_width; //图片宽度(单位mm)
double edge_distance1; //第1段长度(单位mm)
double edge_distance2; //第2段长度(单位mm)
double edge_distance3; //第3段长度(单位mm)
int edge_ratio1; //第1段长度(范围0-100)
int edge_ratio2; //第2段长度(范围0-100)
int edge_ratio3; //第3段长度(范围0-100)
};
}
#endif //DITHER_TYPE_H
2.定义图像抖动算法接口的头文件 Dithering.h。代码如下:
#ifndef DITHERING_H
#define DITHERING_H
#include "stdafx.h"
#include <vector>
#include <opencv2/opencv.hpp>
#include "Type.h"
namespace dither
{
class Dither
{
public:
Dither();
~Dither();
public:
//Ordered图像抖动算法