تغییر بازه دینامیک تصویر در Opencv - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

تغییر بازه دینامیک تصویر در Opencv

0 امتیاز
سلام.

دنبال تابعی هستم تو کتابخانه Opencv که با آن dynamic range تصویر را تغییر بدم همچین چیزی وجود داره یا باید دستی انجامش بدم؟
سوال شده اردیبهشت 12, 1396  بوسیله ی korosh (امتیاز 155)   11 32 37

1 پاسخ

0 امتیاز

OpenCV تابعی به نام cv::LUT داره که شما باید مقادیر مربوط به پالت را دستی پر کنید و سپس با تابع مذکور بر روی تصویر اعمال کنید.

void doLUT(cv::InputArray _src, cv::OutputArray _dst, std::vector<cv::Range> ranges)
	{
		int size = 256;

		CV_Assert(_src.depth() == CV_8U);

		if (_dst.size() != _dst.size() || _src.type() != _dst.type())
			_dst.create(_src.size(), _src.type());

		cv::Mat src = _src.getMat();
		cv::Mat dst = _dst.getMat();

		int channels = _src.channels();

		if (channels == 1){
			cv::Mat lut_mat(1, size, CV_8UC1);
			unsigned char* p_lut = (unsigned char*)lut_mat.ptr<unsigned char>(0);
			for (int i = 0; i < lut_mat.total(); i++)
				if (i < ranges[0].start)
					p_lut[i] = 0;
				else if (i > ranges[0].end)
					p_lut[i] = 255;
				else p_lut[i] = static_cast<unsigned char>(255.0 *(i - ranges[0].start) / (ranges[0].size()));

				cv::LUT(_src, lut_mat, _dst);

		}
		else if (channels == 3){

			std::vector<cv::Mat> imgs;
			split(_src, imgs);

			for (size_t i = 0; i < imgs.size(); i++)
			{
				std::vector<cv::Range> range;
				range.push_back(ranges[i]);
				doLUT(imgs[i], imgs[i], range);
			}


		
		}

	}

 

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