برای حذف این علامت در ابتدا می بایست ماسک علامت را بدست بیارید تصویر را به فضای رنگی HSV انتقال داده و براحتی ناحیه مورد نظر را استخراج کنید .پس از استخراج ماسک با استفاده از عملیات مورفولوژی dilate ماسک بدست آمده را ضخیم تر کنید و سپس جهت از بین بردن بازیابی و ترمیم ناحیه از تکنیک inpaint استفاده کنید.
template<typename T>
cv::Scalar vec3ToScalar(const cv::Vec<T, 3>& vec) {
return cv::Scalar(vec.val[0], vec.val[1], vec.val[2]);
}
cv::Scalar rgb2HsvF(const cv::Scalar & color)
{
cv::Mat hsv_color_mat;
cv::Mat rgb_img(1, 1, CV_32FC3, color);
cv::cvtColor(rgb_img, hsv_color_mat, CV_BGR2HSV_FULL);
return vec3ToScalar<float>(hsv_color_mat.at<cv::Vec3f>());
}
EcvRanges getCircularRange(int value, int size, int tolr)
{
EcvRanges result;
int pos1 = value - tolr;
if (pos1 < 0)
pos1 = size + pos1;
int pos2 = value + tolr;
if (pos2 >= size)
pos2 = pos2 - size;
if (pos1 > pos2) {
result.push_back(EcvRange(pos1, size - 1));
result.push_back(EcvRange(0, pos2));
}
else result.push_back(EcvRange(pos1, pos2));
return result;
}
void HSVFilter(cv::InputArray _src, cv::InputOutputArray _dst, cv::Scalar rgb_color, double hue_tolr, double sature_tolr, double value_tolr)
{
cv::Mat src = _src.getMat();
cv::Mat src_f;
src.convertTo(src_f, CV_32FC3);
cv::Mat hsv_img;
cv::cvtColor(src_f, hsv_img, CV_BGR2HSV_FULL);
std::vector<cv::Mat> hsv_images;
cv::split(hsv_img, hsv_images);
cv::Mat heu_img = hsv_images[0];
cv::Scalar hsv_color = rgb2HsvF(rgb_color);
auto ranges = getCircularRange(hsv_color.val[0], 360, hue_tolr);
std::vector<cv::Mat> hue_masks;
for (int i = 0; i < ranges.size(); i++) {
cv::Mat mask;
cv::inRange(hsv_images[0], cv::Scalar::all(ranges[i].start()), cv::Scalar::all(ranges[i].end()+1), mask);
hue_masks.push_back(mask);
}
cv::Mat hue_mask = hue_masks[0];
if (hue_masks.size() > 1)
cv::bitwise_or(hue_mask, hue_masks[1], hue_mask);
cv::Mat sature_mask;
cv::inRange(hsv_images[1], cv::Scalar::all(hsv_color.val[1] - sature_tolr), cv::Scalar::all(hsv_color.val[1] + sature_tolr), sature_mask);
cv::Mat value_mask;
cv::inRange(hsv_images[2], cv::Scalar::all(hsv_color.val[2] - value_tolr), cv::Scalar::all(hsv_color.val[2] + value_tolr), value_mask);
cv::bitwise_and(hue_mask, sature_mask, _dst);
cv::bitwise_and(_dst, value_mask, _dst);
}
void main(){
const std::string file_name;
cv::Mat src = cv::imread(file_name,1);
cv::Mat red_mask;
HSVFilter(src, red_mask, CV_RGB(255, 0, 0), 30, 0.1, 50);
cv::dilate(red_mask, red_mask, cv::Mat(), cv::Point(-1, -1), 3);
cv::Mat dst;
cv::inpaint(src, red_mask, dst, 3, CV_INPAINT_TELEA);
}