2015-11-30 6 views
3

Мне нужно, чтобы преобразовать изображение в прямоугольник в полутоновое изображение.Как преобразовать выбранный прямоугольник из изображения в оттенки серого?

Я хочу, чтобы преобразовать прямоугольник вокруг трубки в оттенках серого:

for (int i = 612; i >= 0; i = i-204) 
{ 
    cout << "i" << i << endl; 

    rectangle(OI, Rect(i, 0, 161, 643), 1, 2, 8, 0); 
} 

imshow("Display window",OI); 

Я использую rectangle функцию, чтобы нарисовать прямоугольник. Есть ли какие-либо предложения о том, как я могу преобразовать изображение в прямоугольник в оттенки серого?

ответ

2

Вы можете:

  1. Crop изображение 3 канала с заданным прямоугольником
  2. Преобразовать обрезанное изображение в оттенках серого. Результатом будет одноканальный образ
  3. Преобразование изображения в оттенках серого в 3 канала, или вы не можете скопировать его в исходное изображение.
  4. Скопируйте трехканальное изображение в оттенках серого в исходное изображение.

Результат (пример с 2 рои):

enter image description here

Код:

#include <opencv2\opencv.hpp> 
using namespace cv; 

int main() 
{ 
    // Your image 
    Mat3b img = imread("path_to_image"); 

    // Your rects 
    vector<Rect> rois{ Rect(50, 50, 200, 300), Rect(400, 100, 200, 380) }; 

    for (int i = 0; i < rois.size(); ++i) 
    { 
     // Convert each roi to grayscale 
     Mat crop = img(rois[i]).clone();  // Crop is color CV_8UC3 
     cvtColor(crop, crop, COLOR_BGR2GRAY); // Now crop is grayscale CV_8UC1 
     cvtColor(crop, crop, COLOR_GRAY2BGR); // Now crop is grayscale, CV_8UC3 
     crop.copyTo(img(rois[i]));   // Copy grayscale CV_8UC3 into color image 
    } 

    // Show results 
    imshow("Result", img); 
    waitKey(); 

    return 0; 
} 
+0

Большое спасибо за ваше предложение. однако я не могу запустить ваш код. Я получаю ошибку, например, microsoft visual studio 10.0 \ vc \ include \ vector (550): ошибка C2664: 'void std :: vector <_Ty> :: _ Construct <_Iter> (_Iter, _Iter, std :: _ Int_iterator_tag)': невозможно преобразовать параметр 3 от 'Int' в 'станд :: _ Int_iterator_tag' 1> с 1> [ 1> _Ty = сорте :: Rect, 1> _Iter = резюме :: Rect_ 1>] 1 не> нет конструктор может занять тип источника или разрешение перегрузки конструктора были неоднозначными 1> 1> Сборка НЕИСПРАВНО. Как я могу решить эту проблему. еще раз спасибо. –

+1

@AnkitRamani Кажется, что у вас нет C++ 11. Попробуйте изменить векторную строку на: 'vector rois; rois.push_back (Rect (...)); ' – Miki

+0

Большое спасибо за ваше время и предложения. –

0

Если цветовое пространство RGB, вам необходимо усреднить красный, зеленый и синий и записать среднее значение для всех трех образцов. вам понадобится функция на тип поверхности.

Пример предполагая заказ образца RGBRGBRGB ...

unsigned char* pLine = image[i]; // pointer to start of line 'i' 
for (int j=0; i < width; ++j) { // width is pixels per line 
    int gray = ((pLine[j*3] + pLine[j*3 + 1] + pLine[j*2]) + 1)/3; 
    pLine[j*3] = pLine[j*3 + 1] = pLine[j*2]= (unsigned char)gray; 
} 

если цветовое пространство YCbCr/YUV вам нужно написать 128 всем Cb/Cr или УФ-образцы, сохраняя 'Y' как есть. «Y» - это уровень серого.

Если вы хотите рассчитать уровень серого лучше, вы можете использовать аналогичную формулу для той, которая используется при преобразовании RGB-> YUV. 70% зеленый, 20% красный и 10% синий.