فیلتر کردن رنگ خاص در OpenCV - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

فیلتر کردن رنگ خاص در OpenCV

0 امتیاز

سلام.

به تصویر زیر نگاه کنید:

فیلتر رنگ

من فقط قصد دارم اون کادر قرمز رو ماسک کنم؟

سوال شده اردیبهشت 13, 1396  بوسیله ی korosh (امتیاز 155)   11 32 37

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

برای حذف این علامت در ابتدا می بایست ماسک علامت را بدست بیارید تصویر را به فضای رنگی 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);
}

 

پاسخ داده شده خرداد 31, 1396 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
انتخاب شد تیر 6, 1396 بوسیله ی korosh
...