先来python的,
# -*- coding:utf-8 -*- import cv2 as cv import numpy as np def rgb2hsv(r, g, b): r, g, b = r/255.0, g/255.0, b/255.0 mx = max(r, g, b) mn = min(r, g, b) m = mx-mn if mx == mn: h = 0 elif mx == r: if g >= b: h = ((g-b)/m)*60 else: h = ((g-b)/m)*60 + 360 elif mx == g: h = ((b-r)/m)*60 + 120 elif mx == b: h = ((r-g)/m)*60 + 240 if mx == 0: s = 0 else: s = m/mx v = mx H = h / 2 S = s * 255.0 V = v * 255.0 return H, S, V def fixHSVRange(h, s, v): # Normal H,S,V: (0-360,0-100%,0-100%) # OpenCV H,S,V: (0-180,0-255 ,0-255) return (180 * h / 360, 255 * s / 100, 255 * v / 100) # Load the aerial image and convert to HSV colourspace image = cv.imread("d:Screenshot1.png") hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV) rgbs=[(254,214,105),(255,238,187),(151,196,252),(208,239,196),(232,157,224) ,(219,95,209),(13,95,152)] for rgb in rgbs: pixel =rgb2hsv(rgb[0], rgb[1], rgb[2]) brown_hi = np.array([pixel[0] + 20, pixel[1] + 20, pixel[2] + 40]) brown_lo = np.array([pixel[0] - 20, pixel[1] - 20, pixel[2] - 40]) mask=cv.inRange(hsv,brown_lo,brown_hi) image[mask>0]=(255,255,255) rgbs=[(175,174,173),(170,173,167),(175,175,173),(237,236,229)] for rgb in rgbs: pixel =rgb2hsv(rgb[0], rgb[1], rgb[2]) brown_hi = np.array([pixel[0] + 10, pixel[1] + 10, pixel[2] + 20]) brown_lo = np.array([pixel[0] - 10, pixel[1] - 10, pixel[2] - 20]) mask=cv.inRange(hsv,brown_lo,brown_hi) image[mask>0]=(255,255,255) cv.imshow('res',image) cv.imwrite("d:Screenshot3.png", image) # cv.imwrite("result.png",image) cv.waitKey(0) cv.destroyAllWindows()
c#的
private double max(double x, double y, double z) { return (new double[] { x, y, z }).Max(); } private double min(double x, double y, double z) { return (new double[] { x, y, z }).Min(); } private double[] rgb2hsv(double r, double g, double b) { r = r / 255.0; g = g / 255.0; b = b / 255.0; double mx = max(r, g, b); double mn = min(r, g, b); double m = mx - mn; double h = 0; double s = 0; if (mx == mn) h = 0; else if (mx == r) if (g >= b) h = ((g - b) / m) * 60; else h = ((g - b) / m) * 60 + 360; else if (mx == g) h = ((b - r) / m) * 60 + 120; else if (mx == b) h = ((r - g) / m) * 60 + 240; if (mx == 0) s = 0; else s = m / mx; double v = mx; double H = h / 2; double S = s * 255.0; double V = v * 255.0; return new double[] { H, S, V }; } private void btnReplaceColor_Click(object sender, EventArgs e) { var image = Cv2.ImRead(@"d:Screenshot1.png"); new Window("DST", WindowMode.Normal, image); Cv2.WaitKey(); byte[][] rgbs1 = { new byte[] { 254, 214, 105 }, new byte[] { 255, 238, 187 }, new byte[] { 151, 196, 252 }, new byte[] { 208, 239, 196 }, new byte[] { 232, 157, 224 } }; byte[][] rgbs2 = { new byte[] { 175, 174, 173 }, new byte[] { 170, 173, 167 }, new byte[] { 175, 175, 173 }, new byte[] { 237, 236, 229 } }; using (Mat hsv = new Mat()) { Cv2.CvtColor(image, hsv, ColorConversionCodes.BGR2HSV); foreach (var rgb in rgbs1) { var pixel = rgb2hsv(rgb[0], rgb[1], rgb[2]); Scalar brown_hi = new Scalar(pixel[0] + 20, pixel[1] + 20, pixel[2] + 40); Scalar brown_lo = new Scalar(pixel[0] - 20, pixel[1] - 20, pixel[2] - 40); Mat mask = new Mat(); Cv2.InRange(hsv, brown_lo, brown_hi, mask); //image[mask > 0] = (255, 255, 255); image.SetTo(new Scalar(255, 255, 255), mask); } foreach (var rgb in rgbs2) { var pixel = rgb2hsv(rgb[0], rgb[1], rgb[2]); Scalar brown_hi = new Scalar(pixel[0] + 10, pixel[1] + 10, pixel[2] + 20); Scalar brown_lo = new Scalar(pixel[0] - 10, pixel[1] - 10, pixel[2] - 20); Mat mask = new Mat(); Cv2.InRange(hsv, brown_lo, brown_hi, mask); //image[mask > 0] = (255, 255, 255); image.SetTo(new Scalar(255, 255, 255), mask); } } new Window("DST", WindowMode.Normal, image); Cv2.WaitKey(); }