2018-11-27 15:20:59 -0600
| received badge | ● Popular Question
(source)
|
2018-07-29 09:02:11 -0600
| received badge | ● Notable Question
(source)
|
2017-09-17 12:52:04 -0600
| received badge | ● Popular Question
(source)
|
2016-01-31 15:45:27 -0600
| received badge | ● Student
(source)
|
2015-10-13 16:51:16 -0600
| commented answer | Comparing 2 LBPs Great answer. Implemented this and getting great results. |
2015-10-13 16:51:09 -0600
| commented answer | Comparing 2 LBPs Great answer. Implemented this and getting great results. |
2015-10-13 16:50:38 -0600
| received badge | ● Scholar
(source)
|
2015-10-12 11:25:13 -0600
| asked a question | Comparing 2 LBPs I am using code from bytefish.de to generate my LBPs. If I generate 2 LBPs and their corresponding histograms, what is the best way to compare them? This is my code so far: #include "lbp.hpp"
#include "histogram.hpp"
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
int main()
{
//template image
Mat temp = imread("Template.jpg",1);
//image to be compared to
Mat match = imread("Match.jpg",1);
Mat dst,dst2; // image after preprocessing
Mat lbp,lbp2; // lbp image
Mat hist,hist2;
//Convert to gray
cvtColor(temp, dst, 6);
cvtColor(match, dst2, 6);
//remove noise
GaussianBlur(dst, dst, Size(5,5), 5, 3, BORDER_CONSTANT);
GaussianBlur(dst2, dst2, Size(5,5), 5, 3, BORDER_CONSTANT);
//gets the lbp
lbp::ELBP(dst,lbp,1,8);
lbp::ELBP(dst2,lbp2,1,8);
// normalize(lbp2, lbp2, 0, 255, NORM_MINMAX, CV_8UC1);
//normalize(lbp, lbp, 0, 255, NORM_MINMAX, CV_8UC1);
//get histograms
lbp::histogram(lbp,hist,255);
lbp::histogram(lbp2,hist2,255);
//comparing the 2 LBP histograms
double compareHist = cv::norm(hist-hist2);
cout<<compareHist<<endl;
waitKey(0);
return 0;
}
Basically it gives me a quantifiable number as to how similar these two images are.
My question is, how do I improve this result? Whats a better way of acheiving a quantifiable number based on how similar 2 LBPs are? Or is the way I am doing it even right? Thanks. |
2015-10-04 11:16:24 -0600
| asked a question | Implementing Local Binary Patterns (C++) Hi everyone, I am currently following a tutorial on local binary patterns, however the tutorial is in Python and I have to use C++ (with OpenCV). The tutorial is about Texture Matching using Local Binary Patterns. Given an image, it tells how similar the texture is to a template.
The tutorial can be found here (python): http://hanzratech.in/2015/05/30/local... I have done an implementation so far:
LBP.cpp #include "lbp.hpp"
using namespace cv;
template <typename _Tp>
void lbp::OLBP_(const Mat& src, Mat& dst) {
dst = Mat::zeros(src.rows-2, src.cols-2, CV_8UC1);
for(int i=1;i<src.rows-1;i++) {
for(int j=1;j<src.cols-1;j++) {
_Tp center = src.at<_Tp>(i,j);
unsigned char code = 0;
code |= (src.at<_Tp>(i-1,j-1) > center) << 7;
code |= (src.at<_Tp>(i-1,j) > center) << 6;
code |= (src.at<_Tp>(i-1,j+1) > center) << 5;
code |= (src.at<_Tp>(i,j+1) > center) << 4;
code |= (src.at<_Tp>(i+1,j+1) > center) << 3;
code |= (src.at<_Tp>(i+1,j) > center) << 2;
code |= (src.at<_Tp>(i+1,j-1) > center) << 1;
code |= (src.at<_Tp>(i,j-1) > center) << 0;
dst.at<unsigned char>(i-1,j-1) = code;
}
}
}
template <typename _Tp>
void lbp::ELBP_(const Mat& src, Mat& dst, int radius, int neighbors) {
neighbors = max(min(neighbors,31),1); // set bounds...
// Note: alternatively you can switch to the new OpenCV Mat_
// type system to define an unsigned int matrix... I am probably
// mistaken here, but I didn't see an unsigned int representation
// in OpenCV's classic typesystem...
dst = Mat::zeros(src.rows-2*radius, src.cols-2*radius, CV_32SC1);
for(int n=0; n<neighbors; n++) {
// sample points
float x = static_cast<float>(radius) * cos(2.0*M_PI*n/static_cast<float>(neighbors));
float y = static_cast<float>(radius) * -sin(2.0*M_PI*n/static_cast<float>(neighbors));
// relative indices
int fx = static_cast<int>(floor(x));
int fy = static_cast<int>(floor(y));
int cx = static_cast<int>(ceil(x));
int cy = static_cast<int>(ceil(y));
// fractional part
float ty = y - fy;
float tx = x - fx;
// set interpolation weights
float w1 = (1 - tx) * (1 - ty);
float w2 = tx * (1 - ty);
float w3 = (1 - tx) * ty;
float w4 = tx * ty;
// iterate through your data
for(int i=radius; i < src.rows-radius;i++) {
for(int j=radius;j < src.cols-radius;j++) {
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);
// we are dealing with floating point precision, so add some little tolerance
dst.at<unsigned int>(i-radius,j-radius) += ((t > src.at<_Tp>(i,j)) && (abs(t-src.at<_Tp>(i,j)) > std::numeric_limits<float>::epsilon())) << n;
}
}
}
}
template <typename _Tp>
void lbp::VARLBP_(const Mat& src, Mat& dst, int radius, int neighbors) {
max(min(neighbors,31),1); // set bounds
dst = Mat::zeros(src.rows-2*radius, src.cols-2*radius, CV_32FC1); //! result
// allocate some memory for temporary on-line variance calculations
Mat _mean = Mat::zeros(src ... (more) |
2015-10-04 10:04:41 -0600
| received badge | ● Enthusiast
|
2015-10-03 12:02:52 -0600
| commented question | Texture Matching using LBP/H? C++ @theodore there are some coins without text or numbers. So I need to do texture matching. |
2015-10-03 11:34:52 -0600
| asked a question | Texture Matching using LBP/H? C++ I have a question about LBPs, but firstly let me explain what I am trying to do. I am trying to match coins using LBPs. I have an input coin and I want to compare it with other coins and see if the coin is of the same denomination.
Attached below are 3 images: R1 - the input image - the one to be compared to R1T - needs to be compared to R1 R2T - needs to be compared to R1 I have found a very good source here: Local Binary Patterns All my code needs to simply do is say that R1T is a match and R2T is not a match. How can I implement something like this? Thanks
Images: Thumbnails R1 R1T R2T
|
2015-09-21 07:58:41 -0600
| received badge | ● Supporter
(source)
|
2015-09-21 07:30:14 -0600
| commented answer | Template Matching for Coins Thank you for the articles. I will have a look at them.
I have updated my question by adding a few images. Maybe to clarify in what I am asking. |
2015-09-21 07:27:52 -0600
| received badge | ● Editor
(source)
|
2015-09-21 04:34:48 -0600
| asked a question | Template Matching for Coins I am undertaking a project that will automatically count values of coins from an input image. So far I have segmented the coins using some pre-processing with edge detection and using the Hough-Transform. My question is how do I proceed from here? I need to do some template matching on the segmented images based on some previously stored features. How can I go about doing this. I have also read about something called K-Nearest Neighbours and I feel it is something I should be using. But I am not too sure how to go about using it. Research articles I have followed: |
2015-09-20 04:01:14 -0600
| commented question | Matching HOG Images with OpenCV in C++ @LorenaGdL basically I want to input an image with various different coins and I want it to identify each coin correctly and perhaps give a total value of the coins on screen. Basically I've segmented each coin using a hough transform, however how do I say that that coin (segmented) is actually a 10c or 50c etc? |
2015-09-12 16:06:21 -0600
| commented question | Matching HOG Images with OpenCV in C++ |
2015-09-10 00:46:46 -0600
| asked a question | Matching HOG Images with OpenCV in C++ I have currently implemented a way to calculate HOG descriptors using cv::HOGDescriptor() . I have done this for two images and calculated a similarity index between the two images using a basic distance measure. A good match is something I define as a similarity value below 50. A perfect match has a similarity value of 0 However, when comparing these two almost identical images, I get confusing results (i.e. a high value). Below attached is my code and the 2 images. Can anyone please tell me what is going wrong? i.e. Why is there a high similarity value when the images are very similar. #include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <math.h>
#include "opencv2/ocl/ocl.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace std;
using namespace cv;
int main()
{
Mat image(imread("R2.jpg",1));
resize(image, image, Size(64,128) );
Mat img;
cvtColor(image, img, CV_RGB2GRAY);
Mat image2(imread("R2-roi.jpg",1));
resize(image2, image2, Size(64,128) );
Mat img2;
cvtColor(image2, img2, CV_RGB2GRAY);
vector<float> features;
vector<Point> locations;
vector<float> features2;
vector<Point> locations2;
HOGDescriptor *hog = new HOGDescriptor();
HOGDescriptor *hog2 = new HOGDescriptor();
hog->compute(img,features,Size(32,32), Size(0,0),locations);
cout<<features.size()<<endl;;
hog2->compute(img2,features2,Size(32,32), Size(0,0),locations2);
cout<<features2.size()<<endl;
Mat Hogfeat;
Hogfeat.create(features.size(),1,CV_32FC1);
for(int i=0; i<features.size(); i++)
Hogfeat.at<float>(i,0)=features.at(i);
Mat Hogfeat2;
Hogfeat2.create(features2.size(),1,CV_32FC1);
for(int i=0; i<features2.size(); i++)
Hogfeat2.at<float>(i,0)=features2.at(i);
double distance=0;
for(int i=0; i<Hogfeat.rows; i++)
{
distance+= abs(Hogfeat.at<float>(i,0) - Hogfeat2.at<float>(i,0));
}
cout << distance <<endl;
return 0;
}
R2.jpg
R2-roi.jpg
|