由於訊號丟失所產生的畫面大部分均由簡單的純色或少色的人造影象,再加上「訊號丟失」提示資訊所構成,因此訊號丟失畫面的資訊量與正常影象相比較低,因此其對應的二維熵值更小。例如:
上圖所示的訊號丟失畫面由黑色螢幕加上訊號丟失提示組成,畫面簡單,資訊量較低。
而正常畫面具有更多的邊緣資訊,
相較於訊號丟失畫面,正常影象具有更高的資訊量,其對應的二維熵值更大。
bool SignalLossDetection::SignalEntropyLossException(cv::Mat& inputImg, double threshold)
{
//convert the input BGR image to GRAY iamge
cv::cvtColor(inputImg, inputImg, cv::COLOR_BGR2GRAY);
inputImg.convertTo(inputImg, CV_64F);
cv::Mat imgEntropyMap= cv::Mat::zeros(256, 256, CV_64F);// 256 * 256 entropy map
//calculate the mean value of K=8 neighborhood
cv::Mat meanKernal(3, 3, CV_16S);
short mean[]{ 1,1,1,
1,0,1,
1,1,1 };
meanKernal.data = (unsigned char*)mean;
cv::Mat meanMap;
cv::filter2D(inputImg, meanMap, -1, meanKernal, cv::Point(-1, -1), 0.0, cv::BORDER_REFLECT_101);
meanMap /= 8;
//calculate the (intensity, mean intensity of the K=8 neighborhood) two-tuples of the image
inputImg.convertTo(inputImg, CV_8UC1);
meanMap.convertTo(meanMap, CV_8UC1);
for(int i{0};i<meanMap.rows;++i)
for (int j{ 0 }; j < meanMap.cols; ++j) {
imgEntropyMap.at<double>(inputImg.at<uchar>(i, j), meanMap.at<uchar>(i, j))+=1;
}
//calculate the two dimensional entropy of the image
imgEntropyMap /= (inputImg.rows * inputImg.cols);
cv::Mat logMap;
cv::log(imgEntropyMap + 1e-7, logMap);//add delta=1e-7 to avoid overflow
if (-cv::sum(imgEntropyMap)[0] <= threshold)//determine whether the image have the signal loss exception
return true;
else
return false;
}
通過對影象計算二維熵值,並設定合理閾值(Threshold)便能達到訊號丟失畫面檢測的目的。檢測結果如下:
一張正常影象的二維熵值通常較高,如下圖所示H=6.6348,說明影象中存在較多的邊緣資訊,不存在訊號丟失現象。
作為最為常見的訊號丟失情況,純色背景的訊號丟失影象的二維熵值極小,如下圖所示H=0.3419,表明畫面存在訊號丟失異常。
彩色背景的訊號丟失影象使用頻率雖然不如純色背景高,但也有大量的應用場景,通過計算它的二維熵值,發現其二維熵值雖然較純色訊號丟失影象更大,但依舊不高,如下圖所示H=3.3039,依然可以判斷影象存在訊號丟失異常。