简体   繁体   English

Android中的颜色阈值处理(使用OpenCV)

[英]Color Thresholding in Android (using OpenCV)

I have to threshold an image in Android based on certain minimum and maximum values of H, S, and V. I do it as follows. 我必须基于H,S和V的某些最小值和最大值对Android中的图像进行阈值处理。我按以下步骤进行操作。

Mat raw=new Mat();
Mat hsv=new Mat();
org.opencv.android.Utils.bitmapToMat(bitmap, raw);
Imgproc.cvtColor(raw, hsv, Imgproc.COLOR_RGB2HSV);
Imgproc.cvtColor(raw, raw, Imgproc.COLOR_RGB2GRAY);
Mat thresh = new Mat(raw.size(), CvType.CV_8UC1);
for(int x=0;x<raw.cols();x++)
{
    for(int y=0;y<raw.rows();y++)
    {
        double[] data = hsv.get(y,x);
        double H = data[0];
        double S = data[1];
        double V = data[2];
        if(H_MIN<=H && H<=H_MAX && S_MIN<=S && S<=S_MAX && V_MIN<=V && V<=V_MAX) {
            data = new double[] {255};
            thresh.put(y,x, data);
        }
        else
        {
            data = new double[] {0};
            thresh.put(y,x, data);
        }
    }
}

This works fine but is time-consuming for a large image. 这可以很好地工作,但是对于大图像来说很费时间。 Is there a faster, more efficient way to do this? 有更快,更有效的方法来做到这一点吗? (Is there a function in OpenCV to do this, maybe?) (也许OpenCV中有一个功能可以做到这一点?)

In Python, I could just do the following using numpy which is pretty fast. 在Python中,我可以使用numpy进行以下操作,这非常快。

img = cv2.imread(name,1)
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
h = hsv[:,:,0]
s = hsv[:,:,1]
v = hsv[:,:,2]

mask = np.zeros((img.shape[0],img.shape[1]), dtype='uint8')
mask[((h >= minH) & (h <= maxH) & (s >= minS) & (s <= maxS) & (v >= minV) & (v <= maxV))] = 255

There's a library function in OpenCV to do exactly what you're doing inRange(Mat src, Scalar lowerBound, Scalar upperBound, Mat dest) . OpenCV中有一个库函数可以精确地执行inRange(Mat src, Scalar lowerBound, Scalar upperBound, Mat dest)

Mat raw=new Mat();
Mat hsv=new Mat();
org.opencv.android.Utils.bitmapToMat(changedBitmap, raw);
Imgproc.cvtColor(raw, hsv, Imgproc.COLOR_RGB2HSV);
Imgproc.cvtColor(raw, raw, Imgproc.COLOR_RGB2GRAY);
double maxH = 0;
Mat thresh = new Mat();
Core.inRange(hsv, new Scalar(H_MIN, S_MIN, V_MIN), new Scalar(H_MAX, S_MAX, V_MAX), thresh);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM