如何將低於圖像中的黑色像素更改爲使用OpenCV的庫與C紅色像素++
我想圖像中的黑色像素更改爲紅色像素,使得球應該是白色和紅色。我想使用OpenCV庫並使用C++進行編碼。我曾嘗試將圖像轉換爲RGB。
如何將低於圖像中的黑色像素更改爲使用OpenCV的庫與C紅色像素++
我想圖像中的黑色像素更改爲紅色像素,使得球應該是白色和紅色。我想使用OpenCV庫並使用C++進行編碼。我曾嘗試將圖像轉換爲RGB。
常見的方法是門檻的形象,所以你的情況,你可能會說的強度低於某一閾值的每個像素將被視爲是黑色,然後重新着色爲紅色。一種方法找到一個很好的閾值(即將圖像的像素分爲兩大類(「更黑」和「更白」)是Otsu閾值:
int main()
{
cv::Mat input = cv::imread("../inputData/ball_thresholding.jpg");
cv::Mat gray;
cv::cvtColor(input,gray,CV_BGR2GRAY);
cv::Mat mask;
// compute inverse thresholding (dark areas become "active" pixel in the mask) with OTSU thresholding:
double grayThres = cv::threshold(gray, mask, 0, 255, CV_THRESH_BINARY_INV | CV_THRESH_OTSU);
// color all masked pixel red:
input.setTo(cv::Scalar(0,0,255), mask);
// compute median filter to remove the whitish black parts and darker white parts
cv::imshow("input", input);
cv::waitKey(0);
return 0;
}
給予這款面膜:
而這一結果:
對於該圖像,即,通過計算OTSU閾值是12 7,這意味着每個灰度像素強度爲127或更小(或小於127,我不確定)將重新着色爲紅色。
如果你想保持遮光效果withing黑/紅色區域,您可以刪除input.setTo(cv::Scalar(0,0,255), mask);
林德和替換:
// keep the shading:
for(int j=0; j<input.rows; ++j)
for(int i=0; i<input.cols; ++i)
{
if(mask.at<unsigned char>(j,i))
{
input.at<cv::Vec3b>(j,i)[2] = 255;
}
}
這將導致INT:
cv::Mat imBW = imread('bwImg.jpg',CV_LOAD_IMAGE_GRAYSCALE);
cv::Mat RGB_img = cv::Mat(imBW.rows, imBW.cols, CV_8UC3);
cv::Mat R_channel = 255-imBW;
cv::Mat B_channel = cv::Mat::zeros(imBW.rows, imBW.cols, CV_8UC1);
cv::Mat G_channel = cv::Mat::zeros(imBW.rows, imBW.cols, CV_8UC1);
vector<cv::Mat> channels;
channels.push_back(B_channel);
channels.push_back(G_channel);
channels.push_back(R_channel);
cv::merge(channels, RGB_img);
我將使用http://graphics32.org/wiki/ – 2016-01-21 08:34:35
請顯示你的嘗試。 – Wtower
只是爲了好玩,你可以直接在** ImageMagick **(它安裝在大多數Linux發行版上,可用於OS X和Windows)這樣的命令行編寫代碼,就像這樣......'convert ball .jpg -fuzz 50%-fill red -opaque black result.png' –