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

简单的图像处理算法会导致处理冻结

江丰羽
2023-03-14

我已经在处理中编写了一个算法来执行以下操作:

1. Instantiate a 94 x 2 int array
2. Load a jpg image of dimensions 500 x 500 pixels
3. Iterate over every pixel in the image and determine whether it is black or white then change a variable related to the array
4. Print the contents of the array

由于某种原因,这个算法会立即冻结。我在里面放了打印语句,显示它甚至在试图加载图像之前就冻结了。考虑到我已经编写了另一个非常相似的算法,并且执行起来没有并发症,这让我特别困惑。另一种算法读取图像,对指定大小的每块瓷砖的颜色取平均值,然后在用平均颜色取平均值的区域上打印矩形,有效地使图像像素化。两种算法都加载图像并检查其每个像素。这个算法的主要区别在于它没有画任何东西。我想说的是,有一个数组是不同的,但是像素化算法包含了一个颜色数组中的所有颜色,它应该比int数组占用更多的空间。

从我的mac电脑控制台上看。应用程序我看到最初有这样一个错误:“java.lang.OutOfMemoryError:超出了GC开销限制”。根据网络上的其他建议/来源,我尝试将内存分配从256mb提高到4000mb(这样做感觉毫无意义,因为我对算法的分析表明它们应该具有相同的复杂性,但我还是尝试了)。这并没有停止冻结,而是将错误更改为“获取Java异常描述时发生JavaNativeFoundation错误”和“Java.lang.OutOfMemoryError:Java堆空间”的组合。然后我尝试将处理指向我的本地jdk,希望在处理内置的32位jdk上使用64位jdk。从内部处理。app/Contents我执行了以下命令:mv-Java-old-ln-s/Library/Java/JavaVirtualMachines/jdk1。7.0_79.jdk Java处理在这次尝试后无法启动,在我的控制台中出现以下错误:“com.apple.xpc.launchd[1]:(org.Processing.app.160672[13559])服务退出,异常代码:1”

下面是我的代码:首先是不合规算法

int squareSize=50;
int numRows = 10;
int numCols = 10;
PFont myFont;
PImage img;

//33-126
void setup(){
  size(500,500);
  count();
}

void count(){
  ellipseMode(RADIUS);
  int[][] asciiArea = new int[94][2];
  println("hello?");
  img=loadImage("countingPicture.jpg");
  println("image loaded");
  for(int i=0; i<(500/squareSize); i++){
    for(int j=0; j<(500/squareSize); j++){
      int currentValue=i+j*numCols;
      if(currentValue+33>126){
        break;
      }
      println(i+", "+j);
      asciiArea[currentValue][0]=currentValue+33;
      asciiArea[currentValue][1]=determineTextArea(i,j,squareSize);
      //fill(color(255,0,0));
      //ellipse(i*squareSize,j*squareSize,3,3);
    }
  }
  println("done calculating");
  displayArrayContents(asciiArea);
}

int determineTextArea(int i, int j, int squareSize){
  int textArea = 0;
  double n=0.0;
  while(n < squareSize*squareSize){
    n+=1.0;
    int xOffset = (int)(n%((double)squareSize));
    int yOffset = (int)(n/((double)squareSize));
    color c = img.get(i*squareSize+xOffset, j*squareSize+yOffset);
    if(red(c)!=255 || green(c)!=255 || blue(c)!=255){
      println(red(c)+" "+green(c)+" "+blue(c));
      textArea++;        
    }    
  }
  return textArea;
}

void displayArrayContents(int[][] arr){
  int i=0;
  println("\n now arrays");
  while(i<94){
    println(arr[i][0]+" "+arr[i][1]);
  }
}

工作的像素化算法:

PImage img;
int direction = 1;
float signal;
int squareSize = 5;
int wideness = 500;
int highness = 420;
int xDimension = wideness/squareSize;
int yDimension= highness/squareSize;

void setup() {
  size(1500, 420);
  noFill();
  stroke(255);
  frameRate(30);
  img = loadImage("imageIn.jpg");
  color[][] colors = new color[xDimension][yDimension];
  for(int drawingNo=0; drawingNo < 3; drawingNo++){
  for(int i=0; i<xDimension; i++){
    for(int j=0; j<yDimension; j++){
      double average = 0;
      double n=0.0;
      while(n < squareSize*squareSize){
        n+=1.0;
        int xOffset = (int)(n%((double)squareSize));
        int yOffset = (int)(n/((double)squareSize));
        color c = img.get(i*squareSize+xOffset, j*squareSize+yOffset);
        float cube = red(c)*red(c) + green(c)*green(c) + blue(c)*blue(c);
        double grayValue = (int)(sqrt(cube)*(255.0/441.0));
        double nAsDouble = (double)n;
        average=(grayValue + (n-1.0)*average)/n;
        average=(grayValue/n)+((n-1.0)/(n))*average;
      }
      //average=discretize(average);
      println(i+" "+j+" "+average);
      colors[i][j]=color((int)average);
      fill(colors[i][j]);
      if(drawingNo==0){ //stroke(colors[i][j]); }
      stroke(210);}
      if(drawingNo==1){ stroke(150);  }
      if(drawingNo==2){ stroke(90); }
      //stroke(colors[i][j]);
      rect(drawingNo*wideness+i*squareSize,j*squareSize,squareSize,squareSize);
    }
  }
  }
  save("imageOut.jpg");
}

共有1个答案

闾丘鸣
2023-03-14

您正在进入一个无限循环,这使得println()语句不可靠。修复无限循环,打印语句将再次工作。

看看这个循环:

while(i<94){
    println(arr[i][0]+" "+arr[i][1]);
}

i什么时候会变成

你永远不会增加i,所以它的值总是0。可以通过在while循环中添加println()语句来证明这一点:

while(i<94){
    println("i: " + i);
    println(arr[i][0]+" "+arr[i][1]);
}

您可能希望在循环中增加i,而循环中的值。或者只需使用for循环即可。

 类似资料:
  • 大多数图像处理和操作技术可以使用两个库进行有效的处理:Python Imaging Library (PIL) 和 OpenSource Computer Vision (OpenCV)。 下面来简单介绍一下这两个库。 Python 图像库 Python 图像库, 全称为 Python Imaging Library,简称PIL,是Python图像操作的核心库之一。遗憾的是,PIL 的开发工作已经

  • Tensorflow封装了很多图像处理的操作,包括读取图像、图像处理、写图像到文件等等。在批量处理图像时,Tensorflow要求所有的图像都要有相同的Size,即$$(height,width,channels)$$。 读取图像 %matplotlib inline import tensorflow as tf import numpy as np #mil.use('svg') mil.us

  • 安装扩展 使用Composer安装ThinkPHP5的图像处理类库: composer require topthink/think-image 图像操作 下面来看下图像操作类的基础方法。 打开图像文件 假设当前入口文件目录下面有一个image.png文件,如图所示: 使用open方法打开图像文件进行相关操作: $image = \think\Image::open('./image.png');

  • 本文向大家介绍C++ HLSL实现简单的图像处理功能,包括了C++ HLSL实现简单的图像处理功能的使用技巧和注意事项,需要的朋友参考一下 由于对于dxva2解码得到的数据不宜copy回内存给CPU处理,所以最好的办法是在GPU上直接进行处理。D3D的像素着色器能够对像素直接进行操作,实现点运算极其简单方便,简单的卷积运算效果也非常好。但D3D9的限制也很多,对于过于复杂的图像处理则显得有些不能胜

  • 主要内容:GD 库PHP 提供了丰富的图像处理函数,主要包括: 函数 描述 gd_info() 取得当前安装的 GD 库的信息 getimagesize() 获取图像信息 getimagesizefromstring() 获取图像信息 image_type_to_extension() 获取图片后缀 image_type_to_mime_type() 返回图像的 MIME 类型 image2wbmp() 输出WBM

  • Matplotlib 软件包中的 模块提供了加载、缩放和显示图像的功能,该模块只能支持 PNG 格式的图片,如果格式不符,需要对图片的格式进行转换。 Matplotlib 支持的图片格式非常有限,所以通常情况下,建议采用 Python 图像处理库 Pillow 来处理图像,若感兴趣可以自行了解。 下面示例,imread() 函数用于读取图像数据并形成 ndarray 数组 ,其数据类型为 floa