OpenCV4 常用技巧

1. 常用知识

1.1 HSV

  • H: Hue (色度)
    • 表示是什么颜色,即R、G、B等
    • 它使用度来表示,0度:红色,120度:绿色, 240 度:蓝色
  • S: Saturation (饱和度)
    • 颜色有多深,(0-100%)
  • V: Value (色调)
    • 颜色有多亮,(0-100%)
  • 三者关系:
    • 当S=1 V=1时,H所代表的任何颜色被称为纯色;
    • 当S=0时,即饱和度为0,颜色最浅,最浅被描述为灰色(灰色也有亮度,黑色和白色也属于灰色),灰色的亮度由V决定,此时H无意义;
    • 当V=0时,颜色最暗,最暗被描述为黑色,因此此时H(无论什么颜色最暗都为黑色)和S(无论什么深浅的颜色最暗都为黑色)均无意义。
  • RGB转换为HSV
    max=MAX(r,g,b)min=MIN(r,g,b)H={00,if max = min600×gbmaxmin+00if max == r and g >= b600×gbmaxmin+3600if max == r and g < b600×brmaxmin+1200if max == g600×rgmaxmin+2400if max == bS=(maxmin)/max/255V=max/255 \begin{aligned} max &= MAX(r, g, b) \\ min &= MIN(r, g, b) \\ H &= \begin{cases} 0^0, &\text{if max = min} \\ 60^0 \times \frac{g-b}{max-min} + 0^0 &\text{if max == r and g >= b} \\ 60^0 \times \frac{g-b}{max-min} + 360^0 &\text{if max == r and g < b} \\ 60^0 \times \frac{b-r}{max-min} + 120^0 &\text{if max == g} \\ 60^0 \times \frac{r-g}{max-min} + 240^0 &\text{if max == b} \end{cases} \\ S &= (max - min) / max / 255 \\ V &= max / 255 \end{aligned}
  • OpenCV中的HSV
    • H: [0, 180)
    • S: [0., 255)
    • V: [0, 255)
    • 若要区分两种颜色,就找H、S、V中没有重叠的这一个分量
      在这里插入图片描述
  • 示例代码
    Mat src, src_hsv, src_h, src_v, src_s;
	src = imread("1.jpg");
	cvtColor(src,src_hsv,COLOR_BGR2HSV);  // convert to HSV
    vector<Mat> rgb_planes; 
    split(src_hsv, rgb_planes );  // split to 3 mat
    src_h = rgb_planes[0]; // H plane (there is no shadow infomation)
    src_s = rgb_planes[1]; // S plane
    src_v = rgb_planes[2]; // V plane

2. 常用函数

2.1 阈值化操作

2.1.1 直接阈值化

  • 函数定义
double cv::threshold(
	cv::InputArray src,    // 输入图像
	cv::OutputArray dst, // 输出图像
	double thresh,         // 阈值
	double maxValue,    // 向上最大值
	int thresholdType    // 阈值化操作的类型 
);
  • 功能:给定一个输入数组和一个阈值,数组中的每个元素与阈值进行比较,然后把对应的结果写入输出数组中
  • 参数说明
thresholdType 说明 注意
cv::THRESH_BINARY DSTi = (SRCi > thresh) ? maxValue: 0
cv::THRESH_BINARY_INV DSTi = (SRCi > thresh) ? 0 : maxValue
cv::THRESH_TRUNC DSTi = (SRCi > thresh) ? THRESH : SRCi
cv::THRESH_TOZERO DSTi = (SRCi > thresh) ? SRCi : 0
cv::THRESH_TOZERO_INV DSTi = (SRCi > thresh) ? 0 : SRCi
cv::THRESH_OTSU 1) flag, 使用OSTU算法选择最优的阈值
2) 此阈值把像素分为A、B两类,且使A、B类间方差最大
3) 与自适应阈值化的差别,它只有一个阈值,而自适应阈值化每个像素有一个阈值
4) 需与其它thresholdType一起使用,此时thresh参数无效 (THRESH_BINARY | THRESH_OSTU)
不支持32位
cv::THRESH_TRIANGLE 1) flag, 使用Triangle算法选择最优的阈值 不支持32位

2.1.2 自适应阈值化

  • 函数定义
void cv::adaptiveThreshold(
   cv::InputArray src,      // 输入图像
   cv::OutputArray dst,   // 输出图像
   double maxValue,      // 向上最大值
   int adaptiveMethod,   // 自适应方法,平均或高斯
   int thresholdType,      // 阈值化类型
   int blockSize,             // 块大小
   double C                    // 常量
);
  • 功能
    • 自适应阈值根据图像不同区域亮度分布的,改变阈值
    • 使用函数adaptiveThreshold的关键是确定blockSize和C的值)
  • 参数说明
    • blockSize:计算单位是像素的邻域块大小,必须为奇数
    • adaptiveMethod:在一个邻域(由blockSize决定)内计算阈值所采用的算法
adaptiveMethod 说明
cv::ADAPTIVE_THRESH_MEAN_C 计算出邻域的平均值再减去第七个参数double C的值, 即NTi
cv::ADAPTIVE_THRESH_GAUSSIAN_C 计算出邻域的高斯均值再减去第七个参数double C的值,即NTi
thresholdType 说明
cv::THRESH_BINARY DSTi = (SRCi > NTi) ? maxValue: 0
cv::THRESH_BINARY_INV DSTi = (SRCi > NTi) ? 0 : maxValue
  • 示例代码
Mat src = imread("1.jpg");
Mat dst1, dst2, dst3;
cvtColor(src, src, COLOR_BGR2GRAY); // 灰度化
medianBlur(src,src,5);//中值滤波
threshold(src,dst1, 127, 255, THRESH_BINARY);//阈值分割, 最差
adaptiveThreshold(src,dst2,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,11,2);//自动阈值分割,邻域均值, 较好
adaptiveThreshold(src,dst3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,11,2);//自动阈值分割,高斯邻域, 最好

2.2 图像旋转

2.2.1 图像翻转

  • 函数定义
	void cv::flip(
		cv::InputArray src, // 输入图像
		cv::OutputArray dst, // 输出
		int flipCode = 0 // >0: 沿y-轴翻转, 0: 沿x-轴翻转, <0: x、y轴同时翻转
	);
发布了349 篇原创文章 · 获赞 1091 · 访问量 502万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览