Today I founded some new filters for this situation.
c++ code (opencv)
Code:
cv::Mat Img = cv::imread("c:/orign.png");
//filter1
for (int row = 0; row < Img.rows; row++){
for (int col = 0; col < Img.cols-1; col++){
uint8_t b1 = Img.at<cv::Vec3b>(row, col)[0];
uint8_t g1 = Img.at<cv::Vec3b>(row, col)[1];
uint8_t r1 = Img.at<cv::Vec3b>(row, col)[2];
uint8_t h1, s1, v1;
RGB2HSV(r1, g1, b1, &h1, &s1, &v1);
uint8_t b2 = Img.at<cv::Vec3b>(row, col+1)[0];
uint8_t g2 = Img.at<cv::Vec3b>(row, col+1)[1];
uint8_t r2 = Img.at<cv::Vec3b>(row, col+1)[2];
uint8_t h2, s2, v2;
RGB2HSV(r2, g2, b2, &h2, &s2, &v2);
if ((h1 > h2)&&(h1-h2 > 15)&&(h1>100)&&(h1<125)) Img.at<cv::Vec3b>(row, col+1) = cv::Vec3b(0, 0, 0);
}
}
cv::imwrite("c:/filter1.png", Img);
//filter2
for (int row = 0; row < Img.rows; row++){
for (int col = 0; col < Img.cols - 1; col++){
uint8_t b1 = Img.at<cv::Vec3b>(row, col)[0];
uint8_t g1 = Img.at<cv::Vec3b>(row, col)[1];
uint8_t r1 = Img.at<cv::Vec3b>(row, col)[2];
uint8_t h1, s1, v1;
RGB2HSV(r1, g1, b1, &h1, &s1, &v1);
uint8_t b2 = Img.at<cv::Vec3b>(row, col + 1)[0];
uint8_t g2 = Img.at<cv::Vec3b>(row, col + 1)[1];
uint8_t r2 = Img.at<cv::Vec3b>(row, col + 1)[2];
uint8_t h2, s2, v2;
RGB2HSV(r2, g2, b2, &h2, &s2, &v2);
if ((h1 > h2) && (h1 - h2 > 15) && (h2>100) && (h2<125)) Img.at<cv::Vec3b>(row, col) = cv::Vec3b(0, 0, 0);
}
}
cv::imwrite("c:/filter2.png", Img);
//cv::Mat Img2 = Img.clone();
//filter3
for (int row = 0; row < Img.rows; row++){
for (int col = 0; col < Img.cols; col++){
uint8_t b = Img.at<cv::Vec3b>(row, col)[0];
uint8_t g = Img.at<cv::Vec3b>(row, col)[1];
uint8_t r = Img.at<cv::Vec3b>(row, col)[2];
uint8_t h, s, v;
RGB2HSV(r, g, b, &h, &s, &v);
bool is_good_point = false;
if ((h>100) && (h < 125) && (s>60) && (s<120) && (v > 200)) is_good_point = true;
if (!is_good_point) Img.at<cv::Vec3b>(row, col) = cv::Vec3b(0, 0, 0);
}
}
cv::imwrite("c:/filter3.png", Img);