2014-02-15 2 views
0

Используя некоторый критерий, на изображении, которое меня не интересует, есть несколько пикселей. Поэтому я хотел бы их игнорировать. Я просто хочу спросить, приемлемый ли мой подход. Я присвоил этим пикселям отрицательное значение. Будет ли это приемлемо? И что это означает, когда пиксель имеет отрицательное значение? Будет ли это изображение на изображении?Присвоение отрицательного значения пикселю

+1

'Я бы хотел их игнорировать.' Вы просто пренебрегаете им и выполняете операции с другими пикселями. Что касается установки негативных пикселей, да, вы можете, если тип данных изображения поддерживает его. но нет никакого смысла искать физическое представление. значение пикселя обозначает интенсивность этого пикселя, обычно 0 является самым низким (черный) и 255 является самым высоким (белый) для оттенков серого. Поэтому я думаю, что нет смысла спрашивать, что такое интенсивность отрицательного пикселя. –

+1

, поскольку большинство изображений поставляется с * неподписанными * пиксельными типами, что не представляется возможным. но несколько операций opencv позволяют указать маску (например, op применяется только в том случае, если маска не равна нулю) – berak

+1

Множество примеров маскирования, доступных, например. http://www.mathworks.co.uk/matlabcentral/answers/38547-masking-out-image-area-using-binary-mask – YXD

ответ

1

Это зависит от того, как вы используете изображение. Отрицательное значение в пикселе не имеет real. Но если вы используете Matlab функция imshow(img,[]) будет масштабировать все значения с учетом -1 как наименьшее число (поэтому оно будет отображаться на выходе).

Предпочтительно использовать маска. Маска - это двоичный массив того же размера изображения, который указывает, является ли пиксель действительным (1) или нет (0).

Например, в OpenCV существует множество функций, которые могут использовать маску (последний аргумент const CvArr* mask = NULL). Вот вам пример того, как использовать маску в OpenCV:

Mat srcImage; //RGB source image 

//Create a mask. Here we select a rectangle: 
Mat mask = Mat::zeros(srcImage.size(), CV_8U); // type of mask is CV_8U 
Mat roi(mask, cv::Rect(10,10,100,100)); 
roi = Scalar(255, 255, 255); 

//Apply any function to the srcImage ONLY in the points selected by a mask 
SurfFeatureDetector detector(); 
std::vector<KeyPoint> keypoints; 
detector.detect(srcImage, keypoints, mask);  // passing `mask` as a parameter 
1

Если тип данных позволяет, как знаковое целое число (CV_32S) или с плавающей точкой (CV_32F или CV_64F), это имеет смысл использовать отрицательные значения, и это очень распространенный способ указания игнорируемых пикселей. В этом случае нет никакого особого значения для отрицательного значения, кроме вашей интерпретации.

С другой стороны, если вы используете 8-разрядные неподписанные изображения (CV_8U), это может привести к ошибкам: оно может быть усечено до нуля или преобразовано в [0,255] с использованием добавления по модулю-256, в зависимости от вашей версии opencv. В худшем случае он также может переполняться соседними пикселями и изменять их значения, если вы очень плохо обращаетесь к данным о пикселях. Поэтому, если вы работаете с 8-битными изображениями, вам лучше использовать маску для указания игнорируемых пикселей, как объяснил phyrox.

Смежные вопросы