通過官方文檔我們可以列出涵數(shù)threshold的幾個參數(shù)的含義:
src: 輸入的灰度圖像的地址。
dst: 輸出圖像的地址姨丈。
threshold: 進行閾值操作時閾值的大小燎斩。
maxval: 設(shè)定的最大灰度值(該參數(shù)運用在二進制與反二進制閾值操作中)。
type: 閾值的類型时迫。從上面提到的5種中選擇出的結(jié)果椎扬。
src和dst可以很好的理解惫搏,那么這里的第三個參數(shù)是用來做什么的了!這里就說來話長了請看下面一一道來蚕涤。
就用下面這個蘋果來做例子把:
image.png
我們想要獲取它的平面二維圖,這個是不是有個特點筐赔,它的背影是白色的,除了白色就是平面圖了钻趋。那么我要怎么把它給挖出來了川陆。就是把所有的黑色和灰色拿下來就可以了,只要不是白色。
說到這里了就和我們涵數(shù)threshold搭上邊了较沪。
threshold("這里是放輸入圖片地址","輸出圖片地址", 50, 255, CV_THRESH_BINARY);
這個50是最小滿足黑色值要求(0是最黑的數(shù)值鳞绕,255為白色),比50色素小或等于50的部分保留下來其它的全為255白色尸曼。CV_THRESH_BINARY就是代表以這種邏輯使用函數(shù)们何。
/* Threshold types */
enum
{
CV_THRESH_BINARY =0, /* value = value > threshold ? max_value : 0 */
CV_THRESH_BINARY_INV =1, /* value = value > threshold ? 0 : max_value */
CV_THRESH_TRUNC =2, /* value = value > threshold ? threshold : value */
CV_THRESH_TOZERO =3, /* value = value > threshold ? value : 0 */
CV_THRESH_TOZERO_INV =4, /* value = value > threshold ? 0 : value */
CV_THRESH_MASK =7,
CV_THRESH_OTSU =8 /* use Otsu algorithm to choose the optimal threshold value;
combine the flag with one of the above CV_THRESH_* values */
};
從上面可以看出這里的type有8種之多,那么其它代表什么含義了控轿。
CV_THRESH_BINARY_INV 比50色素大且不等于50的部分保留下來其它的全為255白色
CV_THRESH_TRUNC 比50色素小或等于50的部分保留下來冤竹,大于的都被設(shè)為50
CV_THRESH_TOZERO 1 像素點的灰度值大于該閾值50的不進行任何改變;2 像素點的灰度值小于該閾值50的茬射,其灰度值全部變?yōu)?鹦蠕。
CV_THRESH_TOZERO_INV 像素點的灰度值小于該閾值50的不進行任何改變,而大于該閾值50的部分在抛,其灰度值全部變?yōu)?钟病。
像素:
一般我們圖片都是有RGB組成的,也就是紅藍綠主色組成的刚梭。他們的色素滿值都是255.
//這是單通道代碼
- (UIImage *)getPixelImage:(UIImage *)img {
cv::Mat resultImage;
UIImageToMat(img, resultImage);
for (int row = 0; row < resultImage.rows; row++)
{
for (int col = 0; col < resultImage.cols; col++)
{
/* 注意 Mat::at 函數(shù)是個模板函數(shù), 需要指明參數(shù)類型, 因為這張圖是具有紅藍綠三通道的圖,
所以它的參數(shù)類型可以傳遞一個 Vec3b, 這是一個存放 3 個 uchar 數(shù)據(jù)的 Vec(向量). 這里
提供了索引重載, [2]表示的是返回第三個通道, 在這里是 Red 通道, 第一個通道(Blue)用[0]返回 */
if(resultImage.at<cv::Vec3b>(row, col)[3] > 128)
resultImage.at<cv::Vec3b>(row, col) = cv::Vec3b(255, 255, 255);
}
}
UIImage *numberImage = MatToUIImage(resultImage);
return numberImage;
}
這里兩個for可以理解為獲取坐標軸(x,y)肠阱,主要通過這種方式來獲取每個點的像素。[3]這個數(shù)是用來獲取紅藍綠的每個通道朴读。給獲取到的通道賦上白色屹徘。
多通道,也就是三通道
//多通道
- (UIImage *)getPixelImages:(UIImage *)img {
cv::Mat resultImage;
UIImageToMat(img, resultImage);
for (int row = 0; row < resultImage.rows; row++)
{
for (int col = 0; col < resultImage.cols; col++)
{
//主要是這里的代碼(這里是條件語句衅金,獲取那些滿足最小黑色像素的值)
if(*(resultImage.data + resultImage.step[0] * row + resultImage.step[1] * col + resultImage.elemSize1() * 2) > 50)
{
//[row, col]像素的第 1 通道地址被 * 解析(blue通道)
*(resultImage.data + resultImage.step[0] * row + resultImage.step[1] * col) = 255;
//[row, col]像素的第 2 通道地址被 * 解析(green通道), 關(guān)于elemSize1函數(shù)的更多描述請見 Fn1 里所列的博文鏈接
*(resultImage.data + resultImage.step[0] * row + resultImage.step[1] * col + resultImage.elemSize1()) = 255;
//[row, col]像素的第 3 通道地址被 * 解析(red通道)
*(resultImage.data + resultImage.step[0] * row + resultImage.step[1] * col + resultImage.elemSize1() * 2) = 255;
}
}
}
UIImage *numberImage = MatToUIImage(resultImage);
return numberImage;
}
這里就對滿足條件的像素進行改變噪伊,這里也是改為白色。