Порог метод превращает каждый пиксель в черный
Я пытаюсь реализовать свой собственный пороговый метод при обработке, но я получаю полностью черное изображение, когда пытаюсь запустить метод на изображении. Любая помощь?
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;
}
1 ответ
Есть несколько вещей, которые нужно улучшить:
- не кодируйте размеры изображения (300 300), используйте img
.width
а также.height
свойство: вам будет проще повторно использовать ваш код - если вы просматриваете каждый пиксель, нет необходимости использовать вложенный цикл и
imgP
Функция для вычисления индекса пикселей по оси, Y позиции. Просто перебрать один разimg.pixels
(от 0 доimg.pixels.length
)
С точки зрения невыполнения порогового условия, улов является условием и, главным образом, значением сравнения: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();
}
Вот измененная версия образца эскиза из Обработка> Примеры> Изображение> 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();
}