- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我用 Java 编写了一个图像处理应用程序。我已经处理了作为缓冲图像的图像,现在我想为处理过的图像返回 byte[]
,我应该得到二值化图像的字节数组。
这是我的代码:
public static byte[][] binarizeImage(BufferedImage bfImage){
int red;
int newPixel;
int h ;
int w ;
int threshold = otsuTreshold(bfImage);
// this function returns the threshold value 199
BufferedImage binarized = new BufferedImage(bfImage.getWidth(), bfImage.getHeight(), bfImage.getType());
for(int i=0; i<bfImage.getWidth(); i++) {
for(int j=0; j<bfImage.getHeight(); j++) {
// Get pixels
red = new Color(bfImage.getRGB(i, j)).getRed();
int alpha = new Color(bfImage.getRGB(i, j)).getAlpha();
if(red > threshold) {
newPixel = 255;
}
else {
newPixel = 0;
}
newPixel = colorToRGB(alpha, newPixel, newPixel, newPixel);
binarized.setRGB(i, j, newPixel);
}
}
Raster raster = binarized.getData();
h = raster.getHeight();
w = raster.getWidth();
byte[][] binarize_image = new byte[w][h];
for(int i=0 ; i<w ; i++)
{
for(int j=0; j<h ; j++)
{
binarize_image[i][j]=raster.getSampleModel(); //error at this line
}
}
return binarize_image;
}
// Convert R, G, B, Alpha to standard 8 bit
private static int colorToRGB(int alpha, int red, int green, int blue) {
int newPixel = 0;
newPixel += alpha;
newPixel = newPixel << 8;
newPixel += red; newPixel = newPixel << 8;
newPixel += green; newPixel = newPixel << 8;
newPixel += blue;
return newPixel;
}
但它不起作用。我应该怎么做才能将该缓冲图像转换为相同图像数据的字节数组?
最佳答案
我不确定术语“二值化”在这种情况下是什么意思。您似乎只想过滤图像(即根据某个阈值切断红色 channel )并将结果转换为 byte[]
。
假设以上是正确的,然后检查下面的代码。它会将图像转换为 32 位图像的 byte[]
。请考虑以下事项:
byte[]
。您可以在转换期间执行此操作。 byte[]
的大小将是 4 * width * height
而不是 width * height
假设我们正在讨论这种情况的 32 位图像。如果您需要处理其他情况,您应该考虑 BufferedImage
支持的可用图像类型(或者至少只考虑您感兴趣的图像类型)。下面的代码将打印每个转换像素的信息,如下所示(注意红色 channel 是如何过滤的):
[0,0] 转换 [ffaaccee] --> [0, cc, ee, ff]
package imageio.byteconversion;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import javax.imageio.ImageIO;
public class BufferedImageToBytes {
private static void log(String s) {
System.out.println(s);
}
private static String toByteString(int color) {
// Perform a bitwise AND for convenience while printing.
// Otherwise Integer.toHexString() interprets values as integers and a negative byte 0xFF will be printed as "ffffffff"
return Integer.toHexString(color & 0xFF);
}
public static void main(String[] args) throws IOException {
// Load the image. This expects the image to be in the same package with this class
InputStream stream = BufferedImageToBytes.class.getResourceAsStream("test.png");
BufferedImage image = ImageIO.read(stream);
int iw = image.getWidth();
int ih = image.getHeight();
log("Image loaded succesfully, width=" + iw + " height=" + ih);
stream.close();
log("Image color model: " + image.getColorModel());
log("Image sample model: " + image.getSampleModel());
log("Image raster: " + image.getRaster());
int bands = image.getSampleModel().getNumBands();
log("Color bands: " + bands);
if (bands != 4) {
throw new RuntimeException("The image does not have 4 color bands. Are you sure this is a 32-bit image?");
}
int threshold = 199; // <-- decide your threshold here
byte bytes[] = new byte[4 * iw * ih];
int index = 0;
// note that image is processed row by row top to bottom
for(int y = 0; y < ih; y++) {
for(int x = 0; x < iw; x++) {
// returns a packed pixel where each byte is a color channel
// order is the default ARGB color model
int pixel = image.getRGB(x, y);
// Get pixels
int alpha = (pixel >> 24) & 0xFF;
int red = (pixel >> 16) & 0xFF;
int green = (pixel >> 8) & 0xFF;
int blue = pixel & 0xFF;
// perform filtering here depending on threshold
if (red > threshold) {
red = 255;
} else {
red = 0;
}
log("[" + x + "," + y + "]" + " Converting [" + Integer.toHexString(pixel) + "] --> ["
+ toByteString(red) + ", " + toByteString(green) + ", "
+ toByteString(blue) + ", " + toByteString(alpha)
+ "]");
bytes[index++] = (byte) red;
bytes[index++] = (byte) green;
bytes[index++] = (byte) blue;
bytes[index++] = (byte) alpha;
}
}
}
}
关于java - 将缓冲图像转换为具有相同数据的二维字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18503412/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!