【问题标题】:How to get value of specific pixel after converting to hsv?转换为hsv后如何获取特定像素的值?
【发布时间】:2014-04-11 00:52:21
【问题描述】:

我创建了一个小程序,通过将图像转换为 hsv 来检测红色。为了检测红色,我使用最小范围 170,160,160 和最大范围 180,255,255。所以我得到了白色显示红色的 hsv 图像。现在我想知道那个白色像素的值。我知道 x,y 坐标。如何获得像素值?我正在使用 python 和 cv2。

【问题讨论】:

  • 你能添加你的代码吗?

标签: opencv python-2.7


【解决方案1】:

@user3352710 @Pe Dro Hum 在 python 上很容易做到这一点。 这是它的简单代码。

def coords_mouse_disp(event,x,y,flags,param):
    if event == cv2.EVENT_LBUTTONDBLCLK: #left mouse double click 
         print("Orginal BGR:",img[x,y])
         print("HSV values:", HSV[x,y])

path = "your_image_path.png"
while True:
    img = cv2.imread(path)
    #img = cv2.resize(img, None, fx=0.5, fy=0.5)
    HSV = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

    cv2.imshow("Original",img)
    cv2.imshow("HSV", HSV)
    #left mouse click event
    cv2.setMouseCallback("HSV", coords_mouse_disp)
    cv2.setMouseCallback("Original", coords_mouse_disp)

    if cv2.waitKey(1) &0xFF == ord("q"):
        cv2.destroyAllWindows()
        break

【讨论】:

  • 只是一个小修复 - x,y 在打印方法上是相反的:print("Orginal BGR:",img[y,x]);print("HSV values:", HSV[y,x]);
【解决方案2】:

所以你已经有了 x 和 y,

-> 只需创建 1X1 大小的 ROI Mat

-> 使用 CvtColor() 转换 HSV 颜色空间

-> 获取上述结果的像素值

Mat image; //load image here
Mat HSV;
Mat RGB=image(Rect(x,y,1,1)); // use your x and y value

cvtColor(RGB, HSV,CV_BGR2HSV);
Vec3b hsv=HSV.at<Vec3b>(0,0);
int H=hsv.val[0]; //hue
int S=hsv.val[1]; //saturation
int V=hsv.val[2]; //value

您可以参考下面的 C++ 代码,该代码将显示像素对应鼠标位置的 RGB 和 HSV 值。

char window_name[30] = "HSV Segmentation";
Mat src;

static void onMouse( int event, int x, int y, int f, void* ){
 Mat image=src.clone();
 Vec3b rgb=image.at<Vec3b>(y,x);
 int B=rgb.val[0];
 int G=rgb.val[1];
 int R=rgb.val[2];

  Mat HSV;
  Mat RGB=image(Rect(x,y,1,1));
  cvtColor(RGB, HSV,CV_BGR2HSV);

    Vec3b hsv=HSV.at<Vec3b>(0,0);
    int H=hsv.val[0];
    int S=hsv.val[1];
    int V=hsv.val[2];

    char name[30];
    sprintf(name,"B=%d",B);
    putText(image,name, Point(150,40) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );

    sprintf(name,"G=%d",G);
    putText(image,name, Point(150,80) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );

    sprintf(name,"R=%d",R);
    putText(image,name, Point(150,120) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );

    sprintf(name,"H=%d",H);
    putText(image,name, Point(25,40) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );

    sprintf(name,"S=%d",S);
    putText(image,name, Point(25,80) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );

    sprintf(name,"V=%d",V);
    putText(image,name, Point(25,120) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,255,0), 2,8,false );

    sprintf(name,"X=%d",x);
    putText(image,name, Point(25,300) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,0,255), 2,8,false );

    sprintf(name,"Y=%d",y);
    putText(image,name, Point(25,340) , FONT_HERSHEY_SIMPLEX, .7, Scalar(0,0,255), 2,8,false );

 //imwrite("hsv.jpg",image);
 imshow( window_name, image );
}



int main(){
 src = imread("bgr.png",1);
 imshow(window_name,src);
 setMouseCallback( window_name, onMouse, 0 );
 waitKey();  
 }

【讨论】:

  • 我希望我们有类似的 Python :(
  • 我收到“no matting for call to 'setMouseCallback' 这个确切的代码片段错误。如何解决这个问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 2010-12-14
  • 1970-01-01
相关资源
最近更新 更多