1
我使用copyMakeBorder在我的圖像周圍創建100x100x100x100邊框。我想使用cvtColor只將邊框內的圖像部分轉換爲灰色,所以邊框仍然是bgr,我不想用copyTo在圖像邊框內複製某些東西,我會喜歡處理圖像。我查看了所有谷歌,並沒有具體的代碼示例來做到這一點。請問有人提供代碼示例。如何在Opencv中處理圖像的特定部分
我使用copyMakeBorder在我的圖像周圍創建100x100x100x100邊框。我想使用cvtColor只將邊框內的圖像部分轉換爲灰色,所以邊框仍然是bgr,我不想用copyTo在圖像邊框內複製某些東西,我會喜歡處理圖像。我查看了所有谷歌,並沒有具體的代碼示例來做到這一點。請問有人提供代碼示例。如何在Opencv中處理圖像的特定部分
什麼Ed.S建議是正確的 - 在OpenCV中你不能從更大的圖片需要一些投資回報率,並從RGB轉換到位,以灰度轉換不整幅圖像:
Mat src(1024, 768, CV_8UC3);
src.setTo(Scalar(255, 200, 100));
Mat roi = src(Rect(100, 100, 300, 300));
cvtColor(roi, roi, CV_RGB2GRAY); // nothing changed, still src is the same after cvtColor
你可以做的是執行轉換用手在選定的ROI爲灰度,有什麼不涉及複製,而在地方工作:
Mat src(1024, 768, CV_8UC3);
src.setTo(cv::Scalar(255, 200, 100));
cv::imwrite("out.jpg", src);
Mat roi = src(cv::Rect(100, 100, 300, 300));
for(int i=0;i<roi.cols;i++)
for(int j=0;j<roi.rows;j++) {
cv::Vec3b p = roi.at<cv::Vec3b>(j,i);
unsigned char lumination = (unsigned char)(0.2126*p[2] + 0.7152*p[1] + 0.0722*p[0]);
p[0] = p[1] = p [2] = lumination;
roi.at<cv::Vec3b>(j,i) = p;
}
編輯:這裏有一個莉娜例如:
Mat src = imread("lena.jpg");
Mat roi = src(cv::Rect(src.cols/4, src.cols/4, src.cols/2, src.rows/2));
for(int i=0;i<roi.cols;i++)
for(int j=0;j<roi.rows;j++) {
cv::Vec3b p = roi.at<cv::Vec3b>(j,i);
unsigned char lumination = (unsigned char)(0.2126*p[2] + 0.7152*p[1] + 0.0722*p[0]);
p[0] = p[1] = p [2] = lumination;
roi.at<cv::Vec3b>(j,i) = p;
}
cv::imwrite("out.jpg", src);
結果:
非常感謝 – user3517736
你不能有一個單一的形象有兩個或兩個以上不同的像素格式(當然,據我所知。你當然可以自己編寫格式,但是,呃,解析什麼亂七八糟。)你當然可以使用灰度作爲邊界,或者使用bgr,其中r = g = b作爲內部部分,但如果不是你需要更大的動態範圍。在同一圖像中尋找兩個像素格式是一個錯誤,但您需要一個不同的解決方案。 –