Cómo usar matlab para calcular el número de píxeles en el área blanca de una imagen binaria
El principio de cálculo es el siguiente:
Supongamos que el fondo de la imagen binaria es negro, el borde es blanco y el borde blanco no contiene puntos negros, como se muestra en la figura adjunta.
El código fuente del programa es el siguiente:
%% Paso 1
Borrar todas las imágenes
clc
I= imread('test.bmp');%Leer la imagen
bwI=im2bw(I,0.5);%Convertir a imagen binaria
L=bwlabel(bwI, 4); % Marca el área de cuatro líneas
[r,c]=find(L==1 % Encuentra el área blanca en ella, r es un vector compuesto por las filas donde está el blanco); se ubican los puntos, y c es el punto blanco Un vector que consta de la columna en la que se encuentra
% Paso 2% Eliminar números duplicados en r
new_r=[];
para i=1: longitud(r)
nn=find(new_r==r(i));
si está vacío(nn),new_r=[new_r r( i)];end
end
% paso 3
sum_zeros=0;% Número total de puntos de contorno
para i= 1: length(new_r)
n =find(bwI(new_r(i),:)==1);%Encuentra la posición del punto blanco en la línea con el punto blanco
Si longitud(n)==1, continúa; finaliza %Si solo hay un punto blanco en la línea, regresa
num_zeros=n(end)-n(1)+1-longitud (n); de lo contrario, cuente el número de puntos negros intercalados entre los puntos blancos
sum_zeros=sum_zeros+num_zeros;
end
Un ejemplo de binario El gráfico es el siguiente (es decir, un punto negro se intercala entre un punto blanco y un punto negro)
sum_zeros=sum_zeros+num_zeros;
end
Ejemplos de gráficos binarios son los siguientes, por ejemplo, en blanco y negro):
Información ampliada:
Código fuente de implementación del lenguaje C:
#include "opencv2/ ¿highgui/highgui.hpp"?
#include "opencv2/imgproc/imgproc .hpp"?
#include "opencv2/core/core.hpp"
#include
#include
#include "cv.h"
#include "highgui.hpp" ?
#include "highgui.h"
#include
#include
#include
#include < fstream>
usando el espacio de nombres std;
usando el espacio de nombres cv;
// Estadísticas de el porcentaje de píxeles blancos y negros en toda la imagen
int bSums(Mat src)
{ int counter = 0; int black = 0 int n = 0; Iterador para acceder a píxeles Mat_
t) { n++; if ((*it) > 0) {
counter += 1;// Después de la binarización, el píxel es 0 o 255 } else {
negro + = 1; } } } doble biliB = contador * 1.0 / n * 1.0 * 100 * 1.0; doble biliH = negro * 1.0 / n * 1.0 * 100 * 1.0; ; cout << "negro:" << negro << endl; cout << "n:" << n << endl; cout << "biliB:" <<.biliB << endl; " << biliH << endl; contador de retorno;
}
int main(int agrc, char** agrv)
{ Mat imgPath = imread( "D://XR//811416.jpg");//leer la imagen de origen //namedWindow("imagen original", 0); //resizeWindow("imagen original", 500, 500); image" , imgPath); Mat a1; cvtColor(imgPath, a1, COLOR_BGR2GRAY);//transformar a escala de grises //namedWindow("escala de grises", 0); //resizeWindow("escala de grises", 500, 500); imshow (" escala de grises", a1); Mat a2; umbral(a1, a2, 0, 255, THRESH_BINARY | THRESH_OTSU);//binarización //namedWindow("escala de grises", 0); //resizeWindow("Escala de grises", 500, 500) ; imshow("Escala de grises", a2); int a = bSums(a2);//llamar a la función bSums imshow("A", a2); //cout << "A:" << a; devolver 0;
}