当前位置: 首页 > 知识库问答 >
问题:

处理-粗糙像素排序算法在图像的一部分后停止

谭思博
2023-03-14

我编写了一个处理代码,以前使用选择排序对像素进行排序。我必须把它交上来,老师说像这样需要很长时间,所以我决定把像素亮度分成50的部分,然后粗略地排序。但是出来的图像没有完全分类,我真的不知道哪里出了问题。我不需要被完美地分类——这实际上只是为了得到一个看起来很酷的图像。我希望有人能帮助我,我的意思是可以理解的!提前谢谢

PImage img; 
PImage two;
PImage sorted;
int j = 0;
int x = j;
int y = x;
int u = y;
int h = u;
int d = 1;

void setup() {

    size(736,1051); 
    img = loadImage("guy.png");
    two = loadImage("guy2.png");

    background(two); 
}

void draw() {
   loadPixels();

    for (int y = 0; y < height; y++) { 
        for (int x = 0; x < width; x++) {
            int loc = x + y*width;

            float r = red(img.pixels[loc]);
            float g = green(img.pixels[loc]);
            float b = blue(img.pixels[loc]);
            float av = ((r+g+b)/3.0);

            pixels[loc] =  color(g,b,r, 17); //I know r, g, b are switched here
        }    
    }  

    updatePixels();
    save("guy_coloured.png"); 
}

void keyPressed(){
    sorted = loadImage("guy_coloured.png");
    sorted.loadPixels();
    image(sorted, 0, 0);

    System.out.print("doing it");

    for (int i = 0; i < sorted.pixels.length; i++){

        color colours = sorted.pixels[i]; 
        float b = brightness(colours); 
        if(b<50){                      
            sorted.pixels[j] = sorted.pixels[i];
            j++;}
    }
    for (int f = 0; f < img.pixels.length; f++){ 

        color colours = sorted.pixels[f];
        float b = brightness(colours);
        if(b<100 && b>50){
            sorted.pixels[x] = sorted.pixels[f];
            x++;} 
    }
    for (int k = 0; k < img.pixels.length; k++){ 

        color colours = sorted.pixels[k];
        float b = brightness(colours);
        if(b<150 && b>100){
            sorted.pixels[y] = sorted.pixels[k];
            y++;}
    }
    for (int t = 0; t < img.pixels.length; t++){ 

        color colours = sorted.pixels[t];
        float b = brightness(colours);
        if(b<200 && b>150){
            sorted.pixels[u] = sorted.pixels[t];
            u++;}
    }
    for (int o = 0; o < img.pixels.length; o++){ 

        color colours = sorted.pixels[o];
        float b = brightness(colours);
        if(b>200){
            sorted.pixels[h] = sorted.pixels[o];
            h++;}
    }

    System.out.print("done");
    sorted.updatePixels();


    image(sorted, 0, 0);
    save("guy_sorted.png"); 
    noLoop();
}

我希望整个图像被排序,但是它给我回正常的图像,从顶部开始排序大约1/4。这是当前结果:https://imgur.com/kHffIpm

包括不相关部分的完整代码:https://docs.google.com/document/d/1YC97YMq9fKcbCAn3_RvLIm1bNo72FrNnHT3obc9pp7U/edit?usp=sharing

共有1个答案

燕琨
2023-03-14

您不需要对像素进行排序。实际上,你要做的是在图像开始处排列暗像素,并覆盖其中的像素。如果你想对像素进行排序,那么你必须交换它们。

写一个可以交换2像素的函数:

void Swap(PImage toSort, int i1, int i2) {
    color c = toSort.pixels[i1];
    toSort.pixels[i1] = toSort.pixels[i2];
    toSort.pixels[i2] = c;
}

一旦一些像素被排序,并排列在图像的开头,这个区域就不需要进一步研究了。

编写一个函数,根据亮度范围[b_minb_max]对像素进行排序,并从某个索引start开始:

int Sort(PImage toSort, int start, float b_min, float b_max) {

    for (int i = start; i < toSort.pixels.length; i++) {
        float b = brightness(toSort.pixels[i]);
        if (b >= b_min && b < b_max) {
            Swap(toSort, i, start);
            start ++;
        }
    }
    return start;
}

按亮度递增对图像进行排序。例如:

PImage img, two, sorted;

void setup() {
    size(736,1051); 
    img = loadImage("guy.png");
    two = loadImage("guy2.png");
    background(two);  
}

void draw() {
    loadPixels();
    for (int y = 0; y < height; y++) { 
        for (int x = 0; x < width; x++) {
            int loc = x + y*width;
            float r = red(img.pixels[loc]), g = green(img.pixels[loc]), b = blue(img.pixels[loc]);
            pixels[loc] =  color(g,b,r, 17); //I know r, g, b are switched here
       }  
    }        
    updatePixels();
    save("guy_coloured.png"); 
}

void Swap(PImage toSort, int i1, int i2) {
    color c = toSort.pixels[i1];
    toSort.pixels[i1] = toSort.pixels[i2];
    toSort.pixels[i2] = c;
}

int Sort(PImage toSort, int start, float b_min, float b_max) {

    for (int i = start; i < toSort.pixels.length; i++) {
        float b = brightness(toSort.pixels[i]);
        if (b >= b_min && b < b_max) {
            Swap(toSort, i, start);
            start ++;
        }
    }
    return start;
}

void keyPressed(){
    sorted = loadImage("guy_coloured.png");
    sorted.loadPixels();
    image(sorted, 0, 0);

    System.out.print("doing it");

    int j = 0;
    j = Sort(sorted, j, 0.0, 50.0);
    j = Sort(sorted, j, 0.50, 100.0);
    j = Sort(sorted, j, 0.100, 150.0);
    j = Sort(sorted, j, 0.150, 200.0);
    j = Sort(sorted, j, 0.200, 256.0);

    System.out.print("done");
    sorted.updatePixels();

    image(sorted, 0, 0);
    save("guy_sorted.png"); 
    noLoop();
}
 类似资料:
  • 我正在研究图像加密和解密算法。我想使图像像素失真。我想要得到每一个像素值,然后按我想要的方式排序这些像素值,这样图像的像素被扭曲,图像被改变。我是在朝仪式的方向走吗?有什么提示吗?或者可以帮助我的示例算法。 我有一个像素的图像。表示图像由像素组成。如果我选择图像的第一个像素行,它是像素,我将这些像素转换为二进制,然后转换为十进制。现在我得到10个像素的十进制值。我按我想要的方式对这些值进行排序。现

  • 现在,我们知道如何访问图像数据,包括图像或视频的每一个像素的RGBA,下一步我们探索一下处理像素的可能性。本节,通过反转每个像素的颜色,来实现图像的反色处理。 图3-7 图像反色 警告:由于getImageData()方法的安全限制,本节的例子必须在Web服务器上运行。 绘制步骤 按照以下步骤,实现图像的反色处理: 1. 定义画布上下文: window.onload = function(){

  • 本文向大家介绍Python OpenCV处理图像之图像像素点操作,包括了Python OpenCV处理图像之图像像素点操作的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Python OpenCV图像像素点操作的具体代码,供大家参考,具体内容如下 0x01. 像素 有两种直接操作图片像素点的方法: 第一种办法就是将一张图片看成一个多维的list,例如对于一张图片im,想要操作第四行第

  • 1.英文自我介绍 2.硕士研究方向 3.isp相关 4.实习相关 5.反问 ps:15分钟,说方向不相关,不想面可以不面,搁着刷kpi呢

  • > 我有一张NxM大小的原始图像(FigureB-它是原始图像的蓝色香奈儿),从这张图像中我选择一个特定的区域来研究(NewfigureB),大小120x170; 然后我将这个区域划分为我所说的宏像素,即10x10的数据点(像素)阵列; 我然后在所选区域上涂上掩膜,只选择符合一定发光条件的点; 到目前为止,这是我想出来的。如有任何帮助,将不胜感激。 多谢

  • OCR应用前的图像清洗 如何提高Tesseract OCR的准确性? 什么是正确的预处理步骤,我应该遵循改善图像捕捉相机转换为文字使用OCR在Android? 如何确定设备上有文档或卡片? 如何确定卡片的所有有效区域都是完全可见的? 我能想到一些潜在的有用线索: 运动 特性点(很多很多选择,但如何正确使用它们) 当内部相机被卡片或文档压缩时,强度级别会发生显著变化。 对于第一个问题,难点是动态背景