2013-06-29 60 views
3

我想獲得一個圖像,其中只有一個區域具有賦予彩色圖像的顏色。只將圖像的一個區域轉換爲灰度

Mat img = imread("lena.jpg"); 
Rect roi = Rect(100, 100, 300, 300);// only this should be in color in output 

Mat img_yuv; 
cvtColor(img, img_yuv, CV_RGB2YUV); 
vector<Mat> channels(3); 
split(img_yuv, channels); 
Mat Y = channels[0]; 
Mat U = channels[1]; 
Mat V = channels[2]; 

// create mask 
Mat mask = Mat::zeros(Y.size(), Y.type()); 
rectangle(mask, roi, Scalar(1), CV_FILLED); 

// merging channels 
channels[0] = Y; 
channels[1] = U.mul(mask)+(Scalar::all(1)-mask).mul(Y); 
channels[2] = V.mul(mask)+(Scalar::all(1)-mask).mul(Y); 

Mat img_yuv_out, img_out; 
merge(channels, img_yuv_out); 
cvtColor(img_yuv_out, img_out, CV_YUV2RGB); 
imshow("masked_color", img_out); 
imshow("lena", img); 

與上面的opencv代碼在這裏分別是我的輸入和輸出圖像。 。 Input Output

在它工作正常,但圖像的其餘部分看起來並不像一個灰度圖像(不完全一樣,我們仍然有3個渠道的ROI

+0

當你合併,你想分配給0,1,1或0,1,2? –

+0

@RetiredNinja我錯了一個錯字,更新了帖子 – SPV

回答

4

你可以試試這個:

  1. 獲取圖像的副本,並將其轉換爲3通道灰度(我不知道是否需要將灰度顯式轉換回(彩色)RGB ...)
  2. 獲取Mat獲得投資回報想要擁有這些顏色CE的灰度複印,一次用於原始彩色圖像
  3. 分配/彩色圖像ROI複製到灰度圖像ROI

事實上,這是完全一樣@AndreyKamaev提示:

#include <opencv2/core/core.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 
#include <opencv2/highgui/highgui.hpp> 

int main() { 
    char const * const fname_in = "lena.jpg"; 
    char const * const fname_out = "lena_out.jpg"; 
    cv::Mat img = cv::imread(fname_in, CV_LOAD_IMAGE_COLOR); 
    cv::Mat tmp; 
    cv::cvtColor(img, tmp, CV_BGR2GRAY); 
    cv::cvtColor(tmp, tmp, CV_GRAY2BGR); 
    cv::Rect roi(100, 100, 300, 300); 
    img(roi).copyTo(tmp(roi)); 
    img = tmp; 
    cv::imwrite(fname_out, img); 
} 

輸出圖像:

converted lena

1

基本上相同@moooeeeep表明:

Mat tmp; 
cvtColor(img, tmp, COLOR_BGR2GRAY); 
cvtColor(tmp, tmp, COLOR_GRAY2BGR); 
img(roi).copyTo(tmp(roi)); 
img = tmp; 
+0

如果其「基本相同」,爲什麼回答? – Bull

+0

@ user2151446這是提供代碼片段的第一個答案。從我的觀點來看,這是完全合法的。 – moooeeeep