我有一個圖像分成不同的區域相似,但其中一個有不同的亮度,我必須找出哪些區域有不同的亮度。不同亮度的區域
我在我的C++程序中使用OpenCV庫。我將我的圖像從RGB轉換爲HSV空間顏色。然後我測量了每個地區的全球平均值,但似乎並沒有我想象的那麼強勁。
下面的圖像示出了示例:
任何建議?
我有一個圖像分成不同的區域相似,但其中一個有不同的亮度,我必須找出哪些區域有不同的亮度。不同亮度的區域
我在我的C++程序中使用OpenCV庫。我將我的圖像從RGB轉換爲HSV空間顏色。然後我測量了每個地區的全球平均值,但似乎並沒有我想象的那麼強勁。
下面的圖像示出了示例:
任何建議?
對不起,答案是使用Matlab,但方法應該很容易在C++中實現。
估計亮度通道和在0和1之間的歸一化,則可以使用灰色通道,從HSV飽和信道,或者任何可以代表亮度:
L = mat2gray(mean(image, 3));
應用中值濾波器,以除去噪聲和圖像的黑色文物:
L_blur = medfilt2(L, [10 10]);
使用Otsu的Thresholding計算閾值並應用於圖像。這將有可能分裂的直方圖兩個部分分離明亮,較暗的區域:
output = uint8(repmat(mask, [1 1 3])) .* image;
:
mask = L_blur > graythresh(L_blur);
然後,使用一個簡單的元素方式乘法使用生成的二進制掩碼來分割圖像
就是這樣。
這是@Eliezer的great answer的OpenCV中的端口,僅用於完整性。
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat3b img = imread("path_to_image");
// Estimate Luminance Channel
Mat1b L(img.rows, img.cols, uchar(0));
for (int r = 0; r < img.rows; ++r)
{
for (int c = 0; c < img.cols; ++c)
{
Vec3b v = img(r,c);
L(r, c) = saturate_cast<uchar>((float(v[0]) + float(v[1]) + float(v[2]))/3.f);
}
}
// Apply a Median Filter
Mat1b L_blur;
medianBlur(L, L_blur, 11);
// Use OTSU threshold
Mat1b mask;
threshold(L_blur, mask, 0, 255, THRESH_BINARY | THRESH_OTSU);
// Segment image
Mat3b output(img.rows, img.cols, Vec3b(0,0,0));
img.copyTo(output, mask);
imshow("Result", output);
waitKey();
return 0;
}
結果:
全球平均?這是什麼 ? –
通過提供一系列最小和最大HSV值進行全局閾值處理將是一個更好的選擇,請訪問此頁面,其中有一個程序,它爲H,S&V的所有值創建控制窗口並給出結果顏色,顏色與您所需的顏色 – udit043
我的意思是平均在每個地區 – user5780012