Using custom color palette with kmeans color clustering algorithm

         bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), 
            ny = new Mat();
            Utils.bitmapToMat(bitmap, ny);

       Mat bgrImage = new Mat();
        Imgproc.cvtColor(ny, bgrImage, Imgproc.COLOR_RGB2BGR);
        bgrImage.convertTo(bgrImage, CvType.CV_32F, 1.0 / 255.0);

        // Convert the image to grayscale canny ımage
         Mat gres = new Mat();
         Imgproc.cvtColor(ny, gres, Imgproc.COLOR_BGR2GRAY);

        // Compute median intensity
        double medianIntensity = Core.mean(gres).val[0];

        // Compute initial lower and upper thresholds
         double lowerThreshold = 0.8 * medianIntensity;
         double upperThreshold = 1.6 * medianIntensity;

        // Apply Canny edge detection with the computed thresholds
         Mat edges = new Mat();
         Imgproc.Canny(gres, edges, lowerThreshold, upperThreshold);

        // Find contours
        List<MatOfPoint> contours = new ArrayList<>();
        Mat hierarchy = new Mat();
        Imgproc.findContours(edges, contours, hierarchy, 

        // Reshape the image for k-means clustering
        Mat reshapedImage = bgrImage.reshape(1, bgrImage.rows() * 

        // Perform k-means clustering
        Mat labels = new Mat();
        int K = 10;
        Mat centers = new Mat(K, reshapedImage.cols(), reshapedImage.type());

        TermCriteria criteria = new 
           TermCriteria(TermCriteria.EPTermCriteria.MAX_ITER, 10, 2.0);
        Core.kmeans(reshapedImage, K, labels, criteria, 1, 
         Core.KMEANS_PP_CENTERS, centers);

        // Reconstruct the clustered image
        Mat rec = new Mat(bgrImage.rows() * bgrImage.cols(), 3, CvType.CV_32F);
        for (int i = 0; i < reshapedImage.rows(); i++) {
            int j = (int) labels.get(i, 0)[0];

        // Reshape the reconstructed image to original size/type
        rec = rec.reshape(3, bgrImage.rows());
        rec.convertTo(rec, CvType.CV_8U, 255);
        Imgproc.cvtColor(rec, rec, Imgproc.COLOR_BGR2RGB);

        Mat biletra = new Mat();
        Imgproc.bilateralFilter(rec, biletra, 50, 50, 50, Core.BORDER_DEFAULT);
        Imgproc.drawContours(biletra,contours,-1 ,new Scalar (1,1,1),1);

        // Convert the processed image to Bitmap and display it
        Bitmap resultBitmap = Bitmap.createBitmap(rec.cols(), rec.rows(), 
        Utils.matToBitmap(biletra, resultBitmap);

this is the code ı am using for color quantization it works but ı want to add custom color palettes and apply quantizaiton to the colors according to custom palettes is it possible with opencv

just saying, using kmeans for quantization comes with some drawbacks:

  • it’s local. the centers depend on the image content. a different image will give different centers
  • the centers (or labels) are in random order. you might have label[2] == red in one image and green in another

but ı want to add custom color palettes

have a look at color maps in opencv and lookup tables

so basiclly ı have to create custom colormaps and then ı have to apply colormap to the final output if didnt get this wrong

there are no real palette images in opencv
(this is a computer-vision library)

btw, you never mentioned, what you want to achieve here

Pallete Shader by GreenF0x actually this is what i am trying to achieve as you can see you can rearrenge the colors of a image with a color palette and i assumed this application achieves this by applying custom palettes to kmeans algorithm which seems like not possible