阈值方法将每个像素变黑
Threshold method is turning every pixel black
我正在尝试在处理中实现我自己的阈值方法,但是当我尝试 运行 图像上的方法时,我得到了一个全黑的图像。有帮助吗?
void threshold(PImage img) {
for (int i = 0; i < 300; i++) {
for (int j = 0; j < 300; j++) {
if (img.pixels[imgP(i, j)] >= 128)
img.pixels[imgP(i, j)] = 255;
else
img.pixels[imgP(i, j)] = 0;
}
}
img.updatePixels();
}
int imgP(int i, int j) {
return i*300 + j;
}
有两点需要改进:
- 不要硬编码图像尺寸 (300,300),使用 img 的
.width
和 .height
属性:重复使用您的代码会更容易
- 如果您循环遍历每个像素,则无需使用嵌套循环和
imgP
函数从 x,y 位置计算像素索引。只需通过 img.pixels
循环一次(从 0 到 img.pixels.length
)
在阈值条件失败方面,catch是条件,主要是比较值:if (img.pixels[imgP(i, j)] >= 128)
如果打印像素值,您会注意到该值不是从 0 到 255。
您的图像可能是 RGB,因此像素值在不同的范围内。
比方说红色,将 -65536
作为有符号整数或 0xFFFF0000
十六进制(注意 ARGB
)。您的阈值不应该是 128
,而是 -8355712
(FF808080
).
这是函数的重构版本:
void threshold(PImage img,int value) {
for(int i = 0 ; i < img.pixels.length; i++){
if(img.pixels[i] >= color(value)){
img.pixels[i] = color(255);
}else{
img.pixels[i] = color(0);
}
}
img.updatePixels();
}
这是来自 Processing > Examples > Image > LoadDisplayImage:
的示例草图的修改版本
/**
* Load and Display
*
* Images can be loaded and displayed to the screen at their actual size
* or any other size.
*/
PImage img; // Declare variable "a" of type PImage
void setup() {
size(640, 360);
// The image file must be in the data folder of the current sketch
// to load successfully
img = loadImage("moonwalk.jpg"); // Load the image into the program
}
void draw() {
// Displays the image at its actual size at point (0,0)
image(img, 0, 0);
//copy the original image and threshold it based on mouse x coordinates
PImage thresh = img.get();
threshold(thresh,(int)map(mouseX,0,width,0,255));
// Displays the image at point (0, height/2) at half of its size
image(thresh, 0, height/2, thresh.width/2, thresh.height/2);
}
void threshold(PImage img,int value) {
for(int i = 0 ; i < img.pixels.length; i++){
if(img.pixels[i] >= color(value)){
img.pixels[i] = color(255);
}else{
img.pixels[i] = color(0);
}
}
img.updatePixels();
}
我怀疑这是学习 reading/writing/processing 图像的练习。 PImage 有一个 filter()
方法,你可以用它来设定阈值:
img.filter(THRESHOLD, yourThresholdAmountHere);
我正在尝试在处理中实现我自己的阈值方法,但是当我尝试 运行 图像上的方法时,我得到了一个全黑的图像。有帮助吗?
void threshold(PImage img) {
for (int i = 0; i < 300; i++) {
for (int j = 0; j < 300; j++) {
if (img.pixels[imgP(i, j)] >= 128)
img.pixels[imgP(i, j)] = 255;
else
img.pixels[imgP(i, j)] = 0;
}
}
img.updatePixels();
}
int imgP(int i, int j) {
return i*300 + j;
}
有两点需要改进:
- 不要硬编码图像尺寸 (300,300),使用 img 的
.width
和.height
属性:重复使用您的代码会更容易 - 如果您循环遍历每个像素,则无需使用嵌套循环和
imgP
函数从 x,y 位置计算像素索引。只需通过img.pixels
循环一次(从 0 到img.pixels.length
)
在阈值条件失败方面,catch是条件,主要是比较值:if (img.pixels[imgP(i, j)] >= 128)
如果打印像素值,您会注意到该值不是从 0 到 255。
您的图像可能是 RGB,因此像素值在不同的范围内。
比方说红色,将 -65536
作为有符号整数或 0xFFFF0000
十六进制(注意 ARGB
)。您的阈值不应该是 128
,而是 -8355712
(FF808080
).
这是函数的重构版本:
void threshold(PImage img,int value) {
for(int i = 0 ; i < img.pixels.length; i++){
if(img.pixels[i] >= color(value)){
img.pixels[i] = color(255);
}else{
img.pixels[i] = color(0);
}
}
img.updatePixels();
}
这是来自 Processing > Examples > Image > LoadDisplayImage:
的示例草图的修改版本/**
* Load and Display
*
* Images can be loaded and displayed to the screen at their actual size
* or any other size.
*/
PImage img; // Declare variable "a" of type PImage
void setup() {
size(640, 360);
// The image file must be in the data folder of the current sketch
// to load successfully
img = loadImage("moonwalk.jpg"); // Load the image into the program
}
void draw() {
// Displays the image at its actual size at point (0,0)
image(img, 0, 0);
//copy the original image and threshold it based on mouse x coordinates
PImage thresh = img.get();
threshold(thresh,(int)map(mouseX,0,width,0,255));
// Displays the image at point (0, height/2) at half of its size
image(thresh, 0, height/2, thresh.width/2, thresh.height/2);
}
void threshold(PImage img,int value) {
for(int i = 0 ; i < img.pixels.length; i++){
if(img.pixels[i] >= color(value)){
img.pixels[i] = color(255);
}else{
img.pixels[i] = color(0);
}
}
img.updatePixels();
}
我怀疑这是学习 reading/writing/processing 图像的练习。 PImage 有一个 filter()
方法,你可以用它来设定阈值:
img.filter(THRESHOLD, yourThresholdAmountHere);