opencv(Python/c++):阈值化+hsv(重要!!)Threshold函数+hsv通道分离

我们常常需要对图像中的像素做出取舍与决策,直接剔除一些低于或者高于一定值的像素(例如只想要图中红色的东西,这就派上用场了)

Threshold函数
  • THRESH_BINARY(二进制阈值:二值阈值化(某范围保留,其余为0黑色))二值中的maxval很重要,根据thresh和maxval就相当于取范围了

d s t ( x , y ) = { m a x v a l , i f   s r c ( x , y ) > t h r e s h 0 , o t h e r w i s e s dst(x,y)=\begin{cases} maxval, & if \ src(x,y)>thresh \\ 0, & otherwises \end{cases} dst(x,y)={maxval,0,if src(x,y)>threshotherwises

  • THRESH_BINARY_INV(反二进制阈值
    d s t ( x , y ) = { 0 , i f   s r c ( x , y ) > t h r e s h m a x v a l , o t h e r w i s e s dst(x,y)=\begin{cases} 0, & if \ src(x,y)>thresh \\ maxval, & otherwises \\ \end{cases} dst(x,y)={0,maxval,if src(x,y)>threshotherwises
  • THRESH_TRUNC(截断阈值:截断阈值)

d s t ( x , y ) = { t h r e s h o l d , i f   s r c ( x , y ) > t h r e s h s r c ( x , y ) , o t h e r w i s e s dst(x,y)=\begin{cases} threshold, & if \ src(x,y)>thresh \\ src(x,y), & otherwises \\ \end{cases} dst(x,y)={threshold,src(x,y),if src(x,y)>threshotherwises

  • THRESH_TOZERO(反阈值化为0:超过阈值为0)
    d s t ( x , y ) = { s r c ( x , y ) , i f   s r c ( x , y ) > t h r e s h 0 , o t h e r w i s e s dst(x,y)=\begin{cases} src(x,y) , & if \ src(x,y)>thresh \\ 0, & otherwises \\ \end{cases} dst(x,y)={src(x,y),0,if src(x,y)>threshotherwises
  • THRESH_TOZERO_INV(阈值化为0:低于阈值为0)
    d s t ( x , y ) = { 0 , i f   s r c ( x , y ) > t h r e s h s r c ( x , y ) , o t h e r w i s e s dst(x,y)=\begin{cases} 0 , & if \ src(x,y)>thresh \\ src(x,y), & otherwises \\ \end{cases} dst(x,y)={0,src(x,y),if src(x,y)>threshotherwises
adaptiveThreshold函数
补充知识点:hsv通道

这个模型中颜色的参数分别是:色调(H),饱和度(S),明度(V)。
其中H:(360度)
从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;

c++版本

  • hsv通道分离
    在这里插入图片描述代码:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <math.h>
using namespace std;
using namespace cv;



int main(int argc, char *argv[])
{
    //加载图像
    Mat srcImage=imread("/home/liuxin/桌面/opencv/buff.png");
    imshow("原始图",srcImage);

    //变换成hsv通道
    Mat hsvImage;
    cvtColor(srcImage,hsvImage,COLOR_BGR2HSV);

    //分割split 与合并merge
    vector<Mat> hsvsplit;//hsv的分离通道
    split(hsvImage,hsvsplit);
    imshow("明度",hsvsplit[0]);// v 明度
    imshow("饱和度",hsvsplit[1]);// s 饱和度
    imshow("色调",hsvsplit[2]);// h 色调
   while(1)
   {
       int key=cvWaitKey(10);
   if (key==27)
   {
       break;
   }
   }
   return(0);


}
  • 二值化(阈值化)
    注意该结果只是提取了蓝色的因素,因此5号边缘还残留的也保存下来,解决办法是在明度v上也设定范围,这样不够亮的就被去除掉了
    在这里插入图片描述
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/opencv.hpp>
#include <math.h>
using namespace std;
using namespace cv;



int main(int argc, char *argv[])
{
    //加载图像
    Mat srcImage=imread("/home/liuxin/桌面/opencv/buff.png");
    imshow("原始图",srcImage);

    //变换成hsv通道
    Mat hsvImage;
    cvtColor(srcImage,hsvImage,COLOR_BGR2HSV);
    imshow("未增强色调的hsv图片",hsvImage);

    //分割split 与合并merge
    vector<Mat> hsvsplit;//hsv的分离通道
    split(hsvImage,hsvsplit);
    equalizeHist(hsvsplit[2],hsvsplit[2]);//直方图均衡化,增强对比度,hsvsplit[2]为返回的h
    merge(hsvsplit,hsvImage);//在色调调节后,重新合并
    imshow("增强色调对比度后的hsv图片",hsvImage);
    Mat thresHold;
    threshold(hsvsplit[2],thresHold,240,245,THRESH_BINARY);
    imshow("二值化后图片",thresHold);




   while(1)
   {
       int key=cvWaitKey(10);
   if (key==27)
   {
       break;
   }
   }
   return(0);


}
  • 0
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
当使用OpenCV进行图像处理时,可以使用滑动条来调节HSV颜色空间的阈值。下面是一个示例代码,演示了如何创建一个窗口,并在窗口中添加滑动条来调节HSV阈值: ```python import cv2 def on_trackbar(val): pass # 创建一个空白图像 image = np.zeros((300, 300, 3), dtype=np.uint8) # 创建一个窗口 cv2.namedWindow('Threshold') # 创建滑动条 cv2.createTrackbar('Hue Min', 'Threshold', 0, 255, on_trackbar) cv2.createTrackbar('Hue Max', 'Threshold', 255, 255, on_trackbar) cv2.createTrackbar('Saturation Min', 'Threshold', 0, 255, on_trackbar) cv2.createTrackbar('Saturation Max', 'Threshold', 255, 255, on_trackbar) cv2.createTrackbar('Value Min', 'Threshold', 0, 255, on_trackbar) cv2.createTrackbar('Value Max', 'Threshold', 255, 255, on_trackbar) while True: # 获取滑动条的值 hue_min = cv2.getTrackbarPos('Hue Min', 'Threshold') hue_max = cv2.getTrackbarPos('Hue Max', 'Threshold') saturation_min = cv2.getTrackbarPos('Saturation Min', 'Threshold') saturation_max = cv2.getTrackbarPos('Saturation Max', 'Threshold') value_min = cv2.getTrackbarPos('Value Min', 'Threshold') value_max = cv2.getTrackbarPos('Value Max', 'Threshold') # 将图像转换为HSV颜色空间 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 创建一个掩膜,根据滑动条的值来阈值图像 mask = cv2.inRange(hsv, (hue_min, saturation_min, value_min), (hue_max, saturation_max, value_max)) # 显示原始图像和阈值后的图像 cv2.imshow('Original', image) cv2.imshow('Thresholded', mask) # 按下ESC键退出循环 if cv2.waitKey(1) == 27: break # 销毁窗口 cv2.destroyAllWindows() ``` 在这个示例代码中,我们首先创建了一个空白图像,并创建了一个名为"Threshold"的窗口。然后,我们使用`cv2.createTrackbar()`函数创建了六个滑动条,分别用于调节Hue、Saturation和Value的最小和最大阈值。每个滑动条都有一个回调函数`on_trackbar()`,但在这个示例中我们暂时不需要它,所以回调函数中只有一个空的`pass`语句。 在主循环中,我们使用`cv2.getTrackbarPos()`函数获取滑动条的当前值,并将图像转换为HSV颜色空间。然后,我们使用`cv2.inRange()`函数根据滑动条的值创建一个掩膜,将图像阈值。最后,我们使用`cv2.imshow()`函数显示原始图像和阈值后的图像。 你可以根据需要调整滑动条的初始值和范围,并在回调函数中添加适当的处理代码来实现你的需求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值