26 template <
typename _Tp>
29 dst = cv::Mat::zeros(src.rows-2, src.cols-2, CV_8UC1);
30 for(
int i=1;i<src.rows-1;i++) {
31 for(
int j=1;j<src.cols-1;j++) {
32 _Tp center = src.at<_Tp>(i,j);
33 unsigned char code = 0;
34 code |= (src.at<_Tp>(i-1,j-1) > center) << 7;
35 code |= (src.at<_Tp>(i-1,j) > center) << 6;
36 code |= (src.at<_Tp>(i-1,j+1) > center) << 5;
37 code |= (src.at<_Tp>(i,j+1) > center) << 4;
38 code |= (src.at<_Tp>(i+1,j+1) > center) << 3;
39 code |= (src.at<_Tp>(i+1,j) > center) << 2;
40 code |= (src.at<_Tp>(i+1,j-1) > center) << 1;
41 code |= (src.at<_Tp>(i,j-1) > center) << 0;
42 dst.at<
unsigned char>(i-1,j-1) = code;
48 template <
typename _Tp>
49 void lbp::ELBP_(
const cv::Mat& src, cv::Mat& dst,
int radius,
int neighbors) {
50 neighbors = std::max(std::min(neighbors,31),1);
51 dst = cv::Mat::zeros(src.rows-2*radius, src.cols-2*radius, CV_32SC1);
53 for(
int n=0; n<neighbors; n++) {
55 float x =
static_cast<float>(radius) * cos(2.0*M_PI*n/
static_cast<float>(neighbors));
56 float y =
static_cast<float>(radius) * -sin(2.0*M_PI*n/
static_cast<float>(neighbors));
58 int fx =
static_cast<int>(floor(x));
59 int fy =
static_cast<int>(floor(y));
60 int cx =
static_cast<int>(ceil(x));
61 int cy =
static_cast<int>(ceil(y));
66 float w1 = (1 - tx) * (1 - ty);
67 float w2 = tx * (1 - ty);
68 float w3 = (1 - tx) * ty;
71 for(
int i=radius; i < src.rows-radius;i++) {
72 for(
int j=radius;j < src.cols-radius;j++) {
73 float t = w1*src.at<_Tp>(i+fy,j+fx) + w2*src.at<_Tp>(i+fy,j+cx) + w3*src.at<_Tp>(i+cy,j+fx) + w4*src.at<_Tp>(i+cy,j+cx);
75 dst.at<
unsigned int>(i-radius,j-radius) += ((t > src.at<_Tp>(i,j)) && (std::abs(t-src.at<_Tp>(i,j)) > (
int)std::numeric_limits<float>::epsilon())) << n;
82 template <
typename _Tp>
83 void lbp::VARLBP_(
const cv::Mat& src, cv::Mat& dst,
int radius,
int neighbors) {
85 std::max(std::min(neighbors,31),1);
86 dst = cv::Mat::zeros(src.rows-2*radius, src.cols-2*radius, CV_32FC1);
88 cv::Mat _mean = cv::Mat::zeros(src.rows, src.cols, CV_32FC1);
89 cv::Mat _delta = cv::Mat::zeros(src.rows, src.cols, CV_32FC1);
90 cv::Mat _m2 = cv::Mat::zeros(src.rows, src.cols, CV_32FC1);
91 for(
int n=0; n<neighbors; n++) {
93 float x =
static_cast<float>(radius) * cos(2.0*M_PI*n/
static_cast<float>(neighbors));
94 float y =
static_cast<float>(radius) * -sin(2.0*M_PI*n/
static_cast<float>(neighbors));
96 int fx =
static_cast<int>(floor(x));
97 int fy =
static_cast<int>(floor(y));
98 int cx =
static_cast<int>(ceil(x));
99 int cy =
static_cast<int>(ceil(y));
104 float w1 = (1 - tx) * (1 - ty);
105 float w2 = tx * (1 - ty);
106 float w3 = (1 - tx) * ty;
109 for(
int i=radius; i < src.rows-radius;i++) {
110 for(
int j=radius;j < src.cols-radius;j++) {
111 float t = w1*src.at<_Tp>(i+fy,j+fx) + w2*src.at<_Tp>(i+fy,j+cx) + w3*src.at<_Tp>(i+cy,j+fx) + w4*src.at<_Tp>(i+cy,j+cx);
112 _delta.at<
float>(i,j) = t - _mean.at<
float>(i,j);
113 _mean.at<
float>(i,j) = (_mean.at<
float>(i,j) + (_delta.at<
float>(i,j) / (1.0*(n+1))));
114 _m2.at<
float>(i,j) = _m2.at<
float>(i,j) + _delta.at<
float>(i,j) * (t - _mean.at<
float>(i,j));
119 for(
int i = radius; i < src.rows-radius; i++) {
120 for(
int j = radius; j < src.cols-radius; j++) {
121 dst.at<
float>(i-radius, j-radius) = _m2.at<
float>(i,j) / (1.0*(neighbors-1));
128 void lbp::OLBP(
const cv::Mat& src, cv::Mat& dst){
130 case CV_8SC1: OLBP_<char>(src, dst);
break;
131 case CV_8UC1: OLBP_<unsigned char>(src, dst);
break;
132 case CV_16SC1: OLBP_<short>(src, dst);
break;
133 case CV_16UC1: OLBP_<unsigned short>(src, dst);
break;
134 case CV_32SC1: OLBP_<int>(src, dst);
break;
135 case CV_32FC1: OLBP_<float>(src, dst);
break;
136 case CV_64FC1: OLBP_<double>(src, dst);
break;
141 void lbp::ELBP(
const cv::Mat& src, cv::Mat& dst,
int radius,
int neighbors){
143 case CV_8SC1: ELBP_<char>(src, dst, radius, neighbors);
break;
144 case CV_8UC1: ELBP_<unsigned char>(src, dst, radius, neighbors);
break;
145 case CV_16SC1: ELBP_<short>(src, dst, radius, neighbors);
break;
146 case CV_16UC1: ELBP_<unsigned short>(src, dst, radius, neighbors);
break;
147 case CV_32SC1: ELBP_<int>(src, dst, radius, neighbors);
break;
148 case CV_32FC1: ELBP_<float>(src, dst, radius, neighbors);
break;
149 case CV_64FC1: ELBP_<double>(src, dst, radius, neighbors);
break;
154 void lbp::VARLBP(
const cv::Mat& src, cv::Mat& dst,
int radius,
int neighbors){
156 case CV_8SC1: VARLBP_<char>(src, dst, radius, neighbors);
break;
157 case CV_8UC1: VARLBP_<unsigned char>(src, dst, radius, neighbors);
break;
158 case CV_16SC1: VARLBP_<short>(src, dst, radius, neighbors);
break;
159 case CV_16UC1: VARLBP_<unsigned short>(src, dst, radius, neighbors);
break;
160 case CV_32SC1: VARLBP_<int>(src, dst, radius, neighbors);
break;
161 case CV_32FC1: VARLBP_<float>(src, dst, radius, neighbors);
break;
162 case CV_64FC1: VARLBP_<double>(src, dst, radius, neighbors);
break;
168 cv::Mat lbp::OLBP(
const cv::Mat& src){
175 cv::Mat lbp::ELBP(
const cv::Mat& src,
int radius,
int neighbors){
177 ELBP(src, dst, radius, neighbors);
182 cv::Mat lbp::VARLBP(
const cv::Mat& src,
int radius,
int neighbors) {
184 VARLBP(src, dst, radius, neighbors);
void VARLBP_(const cv::Mat &src, cv::Mat &dst, int radius=1, int neighbors=8)
void OLBP_(const cv::Mat &src, cv::Mat &dst)
Original code by philipp <bytefish[at]gmx[dot]de>