Sie sind auf Seite 1von 22

INSTITUTO TECNOLGICO DE TUXTLA GUTIRREZ DIVISIN DE ESTUDIOS DE POSGRADO MAESTRA EN CIENCIAS EN INGENIERA MECATRNICA

MONITOREO DE LAS VARIABLES FISICAS Y ANALISIS DEL CONTENIDO DE NITROGENO EN PLANTACIONES HIDROPONICAS

MATERIA: COMPUTACIN BSICA TITULAR: DR. MADAN PEREZ PATRICIO

PRESENTA:

NOMBRE: SNCHEZ ALEGRA AVISA. NO DE CONTROL: M08270538

TUXTLA GUTIERREZ CHIAPAS A 16 DE DICIEMBRE DE 2013.

Contenido
Introduccin..................................................................................................................................... 3

Objetivo ............................................................................................................................................. 3

Marco terico. ................................................................................................................................. 3

Desarrollo. ........................................................................................................................................ 6 Programa principal. ................................................................................................................... 6 Clases. ......................................................................................................................................... 16

Resultados ..................................................................................................................................... 22

Conclusiones. ............................................................................................................................... 22

Bibliografa ..................................................................................................................................... 22

Introduccin La hidropona es una tcnica de cultivo que no utiliza el suelo. Por ello los nutrientes y alimentos necesarios para el ptimo desarrollo de la planta, tienen que ser aplicados externamente. La cantidad de nutrimentos a aplicarle depender del estado nutrimental de la planta, de las condiciones ambientales y fsicas a las que se encuentre sometida. Para llevar a cabo las tareas de evaluacin y monitoreo de las condiciones ambientales, fsicas y nutricional de las plantas, se necesita personal calificado, adems de personal para la aplicacin de los alimentos y los alimentos que la planta necesite. La contratacin de gente incrementa los costos de produccin. Lo que aqu se pretende es disear un sistema de evaluacin de las variables fsicas, ambientales y nutricionales de las hortalizas en el cultivo hidropnico.

Objetivo Monitorear las variables fsicas de cultivos hidropnicos y determinar su estado nutricional detectando presencia de nitrgeno, y de acuerdo a ello aplicarle alimentos con la nutricin necesaria para aumentar la calidad de la cosecha y proporcionarles alto grado de nutricin, frescura y libre de pesticidas.

Especficos: 1.- monitorear la humedad, temperatura e intensidad luminosa a la que est sometida la planta. 2.-Determinar el estado nutricional, analizando el contenido de nitrgeno. 3.- proporcionar a la planta los alimentos y nutrimentos que necesite.

Marco terico. Un control preciso de la nutricin de las plantas, favorece un mayor rendimiento y una mejora cualitativa de los productos, ya que el control del aporte nutricional a las plantas es mucho ms exacto con lo que logramos la uniformidad de los productos obtenidos. Otra de las ventajas de estos cultivos es la posibilidad de controlar el pH de la disolucin nutritiva, de acuerdo con los requerimientos ptimos del cultivo y de las condiciones ambientales. El pH idneo suele oscilar en 5.5 y 6.5, de forma que el especialista puede ajustar su disolucin nutritiva a estos valores mediante la adicin de NaOH (sosa) para aumentar el pH, o HCl (cido clorhdrico) para disminuirlo.

La hidropona consigue optimizar aquellos factores que afectan directamente al desarrollo de la planta como: la temperatura cuando tiene valores elevados se observa una intensa evapotranspiracin, la iluminacin artificial que habitualmente acelera el crecimiento, el contenido de humedad, en este sentido es preciso recordar que la mayora de los cultivos requieren de un aporte regular y suficiente de agua y por ltimo, la concentracin y forma qumica en la que se presentan los diferentes nutrientes [1]. Sustratos: Son los medios fsicos, distintos al suelo natural, donde se van a desarrollar los cultivos. Deben ser inertes desde el punto de vista nutricional [6]. Los cuales pueden ser de diferentes materiales como arena, grava, arcilla, roca volcnica, arena de rio, perlita, vermiculita, arcilla, aserrn, fibra de coco, cascarilla de arroz, cascarilla de caf, geles y espumas artificiales [2]. La mayora de los sustratos debern ser lavados, esterilizados y desinfectados antes de llevar a cabo el cultivo, de lo contrario podra ocasionar problemas. Nutrientes: los elementos esenciales para el desarrollo de una planta estn divididos en dos grupos: Nutrientes principales, que son los que las plantas requieren en mayores cantidades, los que integran este grupo son: el nitrgeno, el fsforo, el potasio, el calcio, el magnesio y el azufre. Los nutrientes menores, son los que siendo esenciales para el desarrollo de las plantas, estn contenidos en ellas, en muy pequeas cantidades, que van desde 0,01 % hasta 0,0001 %. Este grupo de nutrientes est compuesto por los siguientes: hierro (Fe), cobre (Cu), manganeso (Mn), boro (B), zinc (Zn), molibdeno (Mo) y cloro (Cl). Es necesario destacar, que en la preparacin de la solucin hidropnica es imposible lograr una solucin nutricional ptima, en las diversas condiciones ambientales y en los diferentes estado de desarrollo, puesto que depende de una serie de variables imposibles de controlar, tales como: temperatura, humedad, duracin del da, intensidad de la luz, especie de la planta, variedades, estado de desarrollo y edad, tipo de cultivo (de hoja, fruto, raz, bulbo, tallo, flores). Por lo tanto, la formulacin hidropnica consiste en la obtencin de una mezcla de nutrientes lo ms aproximado posible al ptimo requerido por la planta, efectuar las correcciones peridicas de acuerdo a los cambios que se produzcan en las condiciones ambientales o en la propia estructura de la planta. De ah la necesidad de mantener un monitoreo constante de las variables ambientales a la que este sometida la planta.

Del momento de la siembra hasta que la planta comenz a germinar se reg nicamente con agua 2 veces al da, cuando aparecieron las hojas verdaderas iniciamos con la aplicacin de la solucin nutritiva 2 veces al da. Diariamente se llevamos un registro con todos los datos mencionados anteriormente (humedad, temperatura, luminosidad). Para la medicin de estos parmetros se pretende automatizar el sistema, con sensores. Los sensores toman el dato y lo envan a un arduino que actuar como mediador a la PC, de arduino se enva los datos a la PC, Matlab toma esos datos y con una interfaz grfica hace el muestreo de los datos. A partir del brote de hojas, se anexa a la base de datos fotografas de cmo va el desarrollo de la planta.

Desarrollo. Programa principal. Primero se cre la interfaz grfica COM.

NUMERO DE MUESTRAS A TOMAR: La interfaz grfica comienza en la parte superior con un StaticText, el cual en su campo String contiene el texto NUMERO DE MUESTRAS A TOMAR, la nica funcin es titular al EditText que est a continuacin. El EditText su campo String originalmente esta en blanco, pero es el lugar donde el usuario debe insertar un nmero, el cual ser las muestras a tomar de los sensores, el Tag se llam N_MUESTRAS TOMAR MUESTRA: Utiliza las tres tablas (temperatura, humedad, luminancia), colocadas debajo de l. Las tablas en su campo Tag fueron denominadas como TABLA1, TABLA2 Y TABLA 3, respectivamente. Este push button en su campo Tag se le asign MUESTRAS, quedando s u callback de la siguiente manera.
function MUESTRAS_Callback(hObject, eventdata, handles) val=get(handles.N_MUESTRAS,'string'); %obtiene el valor colocado en el "String" de N_muestras. valor=str2double(val); %convierte la cadena de caracteres obtenidos a nmeros flotantes. sensores=sen(valor); %creamos el objeto "sensores", llama a la clase "sen(m)"que tiene dos mtodos: leer y promediar. Contiene a las propiedades TEMPERATURA, HUMEDAD, LUMINOSIDAD, PROMTEMP, PROMHUM, PROMLUM. (Ver CLASES) sensores.leer %ejecutamos el mtodo "leer" el cual hace las "valor" lecturas y nos devuelve los valores de TEMPERATURA, HUMEDAD Y LUMINOSIDAD.

T=sensores.TEMPERATURA; H=sensores.HUMEDAD; L=sensores.LUMINOSIDAD; %%obtenemos los 3 vectores respectivos a las propiedades calculadas en el mtodo, "leer". set(handles.TABLA1,'Data',T,'ColumnWidth','auto'); set(handles.TABLA2,'Data',H,'ColumnWidth','auto'); set(handles.TABLA3,'Data',L,'ColumnWidth','auto'); %mandamos a los vectores a posicionarse en su tabla correspondiente, creando su propio ancho de columna. sensores.promediar %el mtodo "promediar", calcula el promedio de los 3 vectores del metodo "leer", y los almacena en PROMTEMP, PROMHUM Y PROMLUM. TP=sensores.PROMTEMP; HP=sensores.PROMHUM; LP=sensores.PROMLUM; %obtenemos los 3 promedios respectivos a los 3 vectores de los valores leidos. handles.TP=TP; handles.HP=HP; handles.LP=LP; guidata(hObject,handles); %%salvamos los valores de las variables TP, HP Y LP, que contienen a los promedios, para ser usadas en otras funciones.

Como podemos ver, una vez ejecutado el callback, tendremos en su respectiva tabla a los 3 vectores de valor componentes respectivos a la temperatura, humedad y luminosidad. Tambin tendremos los promedios calculados.

PROMEDIAR DATOS. Su funcin es adquirir los valores de los promedios ya calculados y mostrarlos en los StaticText debajo de l. El Tag de los StaticText se les llamo TPO, THO Y TLO. El tag del pushbutton se llama PROMEDIOS, quedando su callback como sigue.
function PROMEDIOS_Callback(hObject, eventdata, handles) TP=handles.TP; set(handles.TPO,'string',TP); HP=handles.HP; set(handles.THO,'string',HP); LP=handles.LP; set(handles.TLO,'string',LP); %se obtiene los 3 promedios calculados en la funcion "MUESTRAS_Callback(hObject, eventdata, handles)" y se muestran en el String de los StaticText (TPO, THO, TLO)

Ejecutado el cdigo, tenemos la GUIDE ya mostrndonos los promedios.

CAPTURAR IMAGEN. Su funcin es la de tomar una foto guardarla y abrir el siguiente GUIDE, llamado CAPI donde se hace el anlisis de imgenes. El campo Tag fu llamado IMAGEN quedando su callback como sigue:
function IMAGEN_Callback(hObject, eventdata, handles) video=videoinput('winvideo',1,'MJPG_1280x720'); %detecta las cmaras presentes, toma la 1 y comienza a grabar un video imag=getsnapshot(video); %hace una captura de pantalla del video y la guarda en "imag". delete(video); %elimina el video. imwrite(imag,'rabano.jpg'); %guarda la imagen como en formato JPG y lo llama "rabano".

run('CAPI.m') %pone en marcha la otra GUIDE donde se hace el anlisis de imagen.

Una vez ejecutado el cdigo tendremos la imagen guardada y nos abre la interfaz CAPI.

OBTENER MATRICES. Tag= pusbutton2. Su funcin es leer la imagen que tiene todos los nutrimentos necesarios (P1.jpg) y la imagen a analizar (P2.jpg), como analizaremos el contenido de nitrgeno, y la mayor informacin de este se presenta en el canal verde, separamos las imgenes en sus canales respectivos y finalmente coloca las matrices del canal verde en las tablas denominadas PLANTA1 y PLANTA2. Callback:
function pushbutton2_Callback(hObject, eventdata, handles) p=planta; %crea el objeto "p" el cual llama a la clase "planta", contiene las propiedades: verde1 y verde2, y mtodo: canales (vea CLASES) pause(1) p.canales; %ejecutamos el mtodo "canales", el cual entrega las matrices de verde1 y verde2. V1=p.verde1; V2=p.verde2; %tomamos el valor de las matrices verde1 y verde2, para almacenarlos en V1 Y V2. set(handles.TABLA1,'Data',V1,'ColumnWidth',{25});

set(handles.TABLA2,'Data',V2,'ColumnWidth',{25}); %enviamos las matrices V1 y V2 a su respectiva tabla.

SEGMENTAR Esta funcin permite hacer ceros todos los valores que no correspondan a la parte de la planta, como el fondo es blanco, todos los valores superiores a 240 se harn ceros y los menores se quedaran con su valor, de esa manera nos queda una matriz con ceros en su mayora y con su valores de verde. La finalidad es que al hacer la sumatoria de componentes solo influyan los pixeles contenidos en la planta.
function SEGEMENTAR_Callback(hObject, eventdata, handles) seg=segmentacion; %crea el objeto "seg" el cual toma la clase "segmentacion", tiene como propiedades: segmentado1, segmentado2. Y mtodo segmentar. (vea CLASES) seg.segmentar; %ejecutamos el mtodo "segmentar" y almacena los valores de las matrices en las propiedades. V3=seg.segmentado1; V4=seg.segmentado2; %obtenemos las matrices segmentadas, y las almacenamos en las variables V3 Y V3. set(handles.TABLA1,'Data',V3,'ColumnWidth',{25}); set(handles.TABLA2,'Data',V4,'ColumnWidth',{25}); %enviamos V3Y V4 a su respectiva tabla, sustituyendo los valores anteriores.

10

handles.V3=V3; handles.V4=V4; guidata(hObject,handles); %salvamos las variables V3 Y V4, para ser usadas en otra funcion.

En las tablas de nuestra guide, quedan las nuevas matrices ya segmentadas.

Visualizacin de las imgenes segmentadas.

11

INTERACTIVO El men es opcional, si activamos nos abre una figura donde nos muestra las imgenes segmentadas y un cuadro en una esquina inferior con un cursor encima de la planta, eso para ver al mismo tiempo el color de la planta y su valor en pixeles. Callback:
function pushbutton5_Callback(hObject, eventdata, handles) V3=handles.V3; V4=handles.V4; %lee las matrices V3 Y V4, salvadas anteriormente. hfigure=figure('name','PIXELES','position',[10 50 600 600]); %crea la figura donde se visualizara la imagen. himage=imshow(V3); %muestra la imagen V3 en dicha figura. hpanel = impixelregionpanel(hfigure,himage); %muestra el cursor dentro de la imagen mostrada para navegar sobre ella. set(hpanel, 'Position', [0 0 .3 .3]); %crea la sub figura en forma de tabla donde aparecern los valores numricos de la parte seleccionada en la imagen. himage=imshow(V4); hpanel = impixelregionpanel(hfigure,himage); set(hpanel, 'Position', [0 0 .3 .3]);

Representacin grfica.

12

OPERACIONES: Toma las matrices segmentadas colocadas en TABLA1 y TABLA2, toma los vectores fila de las matrices y promedia sus datos. Promedio de datos: suma el valor de cada componente del vector, y lo divide entre el nmero de componentes menos las componentes cuyo valor sea cero. Las sumas de cada vector, forman a su vez un vector columna que es muestreado en la columna 1 de las tablas, en la columna 2 se muestras el nmero de componentes cuyo valor no es cero, en la tercera columna se presenta un vector cuyas componentes es la divisin de las columnas anteriores, para as obtener el promedio de verdes en cada vector fila. Comando v=sum (A): me devuelve un vector fila con la sumatoria de cada columna de la matriz A, si quiero sumar las filas podra usar v=sum (A) que hace la sumatoria de la transpuesta de A, quedando un vector fila con las sumatorias de las columnas de la matriz original. Si adems quiero que el vector resultante sea un vector columna uso v=(sum(A)), que es el vector transpuesto. Callback:
function OPERACIONES_Callback(hObject, eventdata, handles) V3=handles.V3; V4=handles.V4; %obtenemos el valor de V3 Y V4 salvados anteriormente. columnname = {'SUMA','COMPONENTES','PROMEDIOS'}; %definimos el nombre para 3 columnas de la tabla. A=(sum(V3'))'; %A es un vector columna cuyos componentes son las sumatorias de cada vector fila de V3. set(handles.TABLA1,'Data',A,'ColumnWidth','auto','ColumnName',columnname) ; %manda al vector A a colocarse en la columna 1 de la TABLA1. B= (sum (V4'))'; %B es un vector columna cuyos componentes son las sumatorias de cada vector fila de V4. set(handles.TABLA2,'Data',B,'ColumnWidth','auto','ColumnName',columnname) ; %manda al vector B a colocarse en la columna 1 de la TABLA2. nombre={'SUM TOTAL','COMP TOTAL','PROM TOTAL'}; %definimos el nombre para tres columnas para las tablas pequeas ubicadas debajo de las tablas anteriores. A4=sum(A); %obtenemos la suma del vector columna A, lo que significa que es la suma total del valor de todos los pixeles de la planta1.

13

set(handles.ST,'Data',A4,'ColumnWidth','auto','ColumnName',nombre); %mandamos el valor de A4 a colocarse en la columna 1 de la tabla1 pequea. B4=sum(B); %obtenemos la suma del vector columna B, lo que significa que es la suma total del valor de todos los pixeles de la planta2. set(handles.PT,'Data',B4,'ColumnWidth','auto','ColumnName',nombre); %mandamos el valor de B4 a colocarse en la columna 1 de la tabla2 pequea. pause(1); bin=binarizacion; %crea el objeto "bin" que llama a la clase "binarizacion" de propiedades: binario1 y binario2, y su mtodo "binarizar". (Vea CLASES). bin.binarizar; %ejecuta el mtodo "binarizar" y le asigna valores a: binario1 y binario2. Son matrices de ceros y unos, toman el valor cero todos los pixeles de valor mayor a 240, y unos todos los dems. Esto se hace para saber cuntos pixeles realmente conforman a las plantas, descartando los pixeles del fondo blanco. V5=bin.binario1; V6=bin.binario2; %almacenamos las matrices de binario1 y binario2 en V5 y V6. A1=(sum(V5'))'; %hacemos la sumatoria de cada vector fila de V5 resultando un vector columna. La sumatoria entonces, se puede interpretar como el nmero de pixeles que pertenecen a la planta. Descartando los del fondo blanco. A12=[A A1]; %creamos una matriz A12 con los dos vectores columna A y A1. B1=(sum(V6'))'; %hacemos la sumatoria de cada vector fila de V6 resultando un vector columna. La sumatoria entonces, se puede interpretar como el nmero de pixeles que pertenecen a la planta. Descartando los del fondo blanco. B12=[B B1]; %creamos una matriz B12 con los dos vectores columna B y B1. set(handles.TABLA1,'Data',A12,'ColumnWidth','auto'); set(handles.TABLA1,'Data',B12,'ColumnWidth','auto'); %mandamos a las matrices A12 Y B12, a posicionarse en TABLA1 y TABLA2. pause(1); A42=sum(A1); %hacemos la sumatoria del vector columna A1. A41=[A4 A42]; %creamos el vector fila de 2 componentes A4 y A42. set(handles.ST,'Data',A41,'ColumnWidth','auto','ColumnName',nombre); %colocamos al vector A41 en la tabla1 pequea. B42=sum(B1); %hacemos la sumatoria del vector B1. B41=[B4 B42]; %%creamos el vector fila de 2 componentes B4 y B42.

14

set(handles.PT,'Data',B41,'ColumnWidth','auto','ColumnName',nombre); %colocamos al vector A41 en la tabla1 pequea. pause(1); A2=A./A1; %se obtiene un nuevo vector A2, resultado de la divisin componente a componente de los vectores A y A1, esto vendra siendo el promedio de verdes de cada vector fila de la planta1. A3=[A12 A2]; %se crea una matriz A3, con la matriz A12 y el vector A2. set(handles.TABLA1,'Data',A3,'ColumnWidth','auto'); %muestreamos la matriz A3 en la TABLA1. B2=B./B1; %se obtiene un nuevo vector B2, resultado de la divisin componente a componente de los vectores B y B1. Esto vendra siendo el promedio de verdes de cada vector fila de la planta2. B3=[B12 B2]; %se crea una matriz B3, con la matriz B12 y el vector B2. set(handles.TABLA2,'Data',B3,'ColumnWidth','auto'); %muestreamos la matriz B3 en la TABLA1. pause(1); A43=A4/A42; %A43 contiene el promedio total de verde en la planta1. A44=[A4 A42 A43]; %formamos un vector fila de 3 componentes. siendo A43 el promedio total de verde en la planta1 set(handles.ST,'Data',A44,'ColumnWidth','auto','ColumnName',nombre); %muestreamos el vector A44 en la tabla1 pequea. B43=B4/B42; %A43 contiene el promedio total de verde en la planta1. B44=[B4 B42 B43]; %formamos un vector fila de 3 componentes. Siendo B43 el promedio total de verde en la planta2. set(handles.PT,'Data',B44,'ColumnWidth','auto','ColumnName',nombre); %enviamos el vector B44 a la tabla2 pequea.

15

Clases. Para la primera GUIDE (COM) se utiliz una clase llamada sen que a su vez es hija de la clase sensor. La clase sensor se cre para otras posibles lecturas de sensores que se lleven a cabo.
classdef sensor<handle properties MUESTRAS='' %definimos solo una propiedad. end methods (Abstract=true) %los metodos abstractos solo pueden ejecutarse en clases heredadas. leer(obj) graficar(obj) promediar(obj) end end

A continuacin veremos la clase sen que fue la utilizada en nuestro programa principal.
classdef sen < sensor properties %declaramos las 6 propiedades. %vectores de m componentes. TEMPERATURA HUMEDAD LUMINOSIDAD %promedios de los vectores anteriores. PROMTEMP PROMHUM PROMLUM end methods function obj=sen(m) %constructor que necesita un valor m de entrada. obj.MUESTRAS=m; %m es asignado a la propiedad heredada MUESTRAS. end function leer(obj) %creamos 3 figuras que nos servirn para graficar los valores que leeremos de los sensores. f1 = figure('Name','TEMPERATURA','position',[10 50 450 300]); axes('XLim',[0 obj.MUESTRAS],'YLim',[-1 6]); l1 = line(nan,nan,'Color','r','LineWidth',2); xlabel('NUMERO DE MUESTRAS') ylabel('GRADOS') title('VARIACION DE LA TEMPERATURA') grid on hold on

16

f2 = figure('Name','HUMEDAD','position',[460 50 450 300]); axes('XLim',[0 obj.MUESTRAS],'YLim',[-1 6]); l2 = line(nan,nan,'Color','g','LineWidth',2); xlabel('NUMERO DE MUESTRAS') ylabel('RH') title('VARIACION DE LA HUMEDAD') grid on hold on f3 = figure('Name','LUMINOSIDAD','position',[910 50 450 300]); axes('XLim',[0 obj.MUESTRAS],'YLim',[-1 6]); l3 = line(nan,nan,'Color','b','Linewidth',2); xlabel('NUMERO DE MUESTRAS') ylabel('LUMENES') title('VARIACION DE LA LUZ') grid on hold on %inicializamos el puerto serial COM4. delete(instrfind({'Port'},{'COM4'})); s = serial('COM4','BaudRate',9600); warning('off','MATLAB:serial:fscanf:unsuccessfulRead'); fopen(s); t=1; %hace el nmero de lecturas indicadas en el valor de entrada m, que a su %vez fue asignado a MUESTRAS. while t<=obj.MUESTRAS %lectura TEMP=fscanf(s,'%d'); HUM=fscanf(s,'%d'); LU=fscanf(s,'%d'); %conversin. Aqu tambin se va almacenando 3 vectores. G(t)=(TEMP*5/1024); R(t)=(HUM*5/1024); L(t)=(LU*5/1024); %graficamos los vectores anteriores cada vez con una componente ms. set(l1,'YData',G(1:t),'XData',1:t); set(l2,'YData',R(1:t),'XData',1:t); set(l3,'YData',L(1:t),'XData',1:t); drawnow; t=t+1; end %asignamos el valor de los vectores anteriores a sus propiedades respectivas. obj.TEMPERATURA=G; obj.HUMEDAD=R; obj.LUMINOSIDAD=L fclose(s) end

17

function graficar(obj) %mtodo no util en este caso, pero es uno heredado de sensor. end function promediar(obj) %mtodo que calcula los promedios de los vectores formados por las lecturas. Y lo asigna a su propiedad respectiva. obj.PROMTEMP=sum(obj.TEMPERATURA)/obj.MUESTRAS; obj.PROMHUM=sum(obj.HUMEDAD)/obj.MUESTRAS; obj.PROMLUM=sum(obj.LUMINOSIDAD)/obj.MUESTRAS end end end

Para la segunda GUIDE (CAPI), se utilizaron 3 clases que a su vez son hijas de una clase general llamada PLANTAS.
classdef PLANTAS<handle properties planta1 planta2 rojo1 verde1 azul1 rojo2 verde2 azul2 end methods function obj=PLANTAS %constructor %lee las imagenes y las asigna a sus respectivas propiedades. obj.planta1=imread('P1.jpg'); obj.planta2=imread('P2.jpg'); end end end

La primera clase de nuestro programa principal fu planta.


classdef planta<PLANTAS properties % a las heredades se le agrega la propiedad figura. figura end methods function obj=planta %constructor %crea una figura y muestra en ella las plantas ledas en PLANTAS. obj.figura=figure('name','imagenes','position',[10 50 1350 600]); subplot(1,2,1), imshow(obj.planta1); subplot(1,2,2), imshow(obj.planta2); end

18

function canales(obj) %separa las plantas en 3 matrices de colores RGB y las asigna a sus propiedades respectivas heredades de PLANTAS. obj.rojo1=obj.planta1(:,:,1); obj.verde1=obj.planta1(:,:,2); obj.azul1=obj.planta1(:,:,3); obj.rojo2=obj.planta2(:,:,1); obj.verde2=obj.planta2(:,:,2); obj.azul2=obj.planta2(:,:,3); %muestra de forma semi-animada la separacin de los canales de las plantas en figura. subplot(2,4,1), imshow(obj.planta1); title('ORIGINAL1'); pause(0.1) subplot(2,4,2), imshow(obj.rojo1); title('ROJO1'); pause(0.1) subplot(2,4,3), imshow(obj.verde1); title('VERDE1'); pause(0.1) subplot(2,4,4), imshow(obj.azul1); title('AZUL1'); pause(1) subplot(2,4,5), imshow(obj.planta2); title('ORIGINAL1'); pause(0.1) subplot(2,4,6), imshow(obj.rojo2); title('ROJO2'); pause(0.1) subplot(2,4,7), imshow(obj.verde2); title('VERDE2'); pause(0.1) subplot(2,4,8), imshow(obj.azul2); title('AZUL2'); pause(1) subplot(1,2,1), imshow(obj.verde1); title('VERDE1'); subplot(1,2,2), imshow(obj.verde2); title('VERDE2'); pause(2) close(obj.figura); %cierra la figura end end end

19

La segunda clase fue segmentacin.


classdef segmentacion<PLANTAS properties figura segmentado1 segmentado2 end methods function obj=segmentacion %constructor. %usamos propiedades heredadas de planta. obj.verde1=obj.planta1(:,:,2); %canal verde de planta1. obj.verde2=obj.planta2(:,:,2); %canal verde de planta2. obj.figura=figure('position',[10 50 1000 500]); end function segmentar(obj) V3=obj.verde1; %asignamos a V3 la matriz de canal verde1. %convertimos los pixeles mayores a 240 en 0. [p k]=size(V3); for i=1:p for j=1:k if (V3(i,j)>240) V3(i,j)=0; end end end subplot(1,2,1), imshow(V3); %mostramos en figura la matriz V3. V4=obj.verde2; %asignamos a V4 la matriz de canal verde2. % convertimos los pixeles mayores a 240 en 0. [m n]=size(V4); for i=1:m for j=1:n if (V4(i,j)>240) V4(i,j)=0; end end end subplot(1,2,2), imshow(V4); %mostramos en figura la matriz V3. pause(3); %para ver cmo quedan las figuras segmentadas. close(obj.figura); %cerramos figura. %asignamos las matrices segmentadas a las propiedades respectivas obj.segmentado1=V3; obj.segmentado2=V4; end end end

20

La tercera clase fue binarizacin.


classdef binarizacion<PLANTAS properties binario1 binario2 end methods function obj=binarizacion %constructor obj.verde1=obj.planta1(:,:,2); %canal verde de planta1. obj.verde2=obj.planta2(:,:,2); %canal verde de planta2. end function binarizar(obj) V5=obj.verde1; %V5 obtiene la matriz de verde1. V6=obj.verde2; %V6 obtiene la matriz de verde2. %en ambas matrices hacemos que los pixeles mayores a 240 sean 0, y el resto 1. [n m]=size(V5); [n1 m1]=size(V6); for i=1:n for j=1:m if V5(i,j)>240 V5(i,j)=0; else V5(i,j)=1; end end end for i=1:n1 for j=1:m1 if V6(i,j)>240 V6(i,j)=0; else V6(i,j)=1; end end end obj.binario1=V5; %asignamos la matriz V5 de ceros y unos a la propiedad binario1. obj.binario2=V6; %%asignamos la matriz V6 de ceros y unos a la propiedad binario2. end end end

21

Resultados GUIDE COM Al final obtenemos 3 vectores, uno para cada variable fsica monitoreada, mostrados en las tablas con su respectivo nombre, as como su promedio para que tomemos el valor ms confiable. Obtenemos la captura de una imagen que ser la imagen a comparar con una que se tenga dentro del sistema. GUIDE CAPI. Al final tenemos muestreados 3 vectores columnas en cada tabla, en la columna 1 se encuentra el vector que contiene a las sumatorias de cada vector fila de la matriz de canal verde, en la columna 2 tenemos la cantidad de componentes de los vectores fila que su valor es diferente de 0, y en la columna 3 tenemos el vector de promedios de cada fila de la matriz. Tambin tenemos las sumatorias totales en las tablas ms pequeas mostradas abajo, las cuales representan las sumatorias de cada uno de los vectores descritos anteriormente.

Conclusiones. El canal verde de una imagen nos proporciona la cantidad de nitrgeno presente en las plantas, con este algoritmo podemos determinar la diferencia entre el contenido de verde total de las imgenes o bien de cada vector fila. Como en este caso, la planta 1 tiene un valor mayor de verde que la planta 2, concluimos que la planta 2, tiene un dficit de nitrgeno, por lo que ser necesario aplicarle mas nutrimentos.

Bibliografa 1. - diseo y Construccin de un Sistema NFT (Nutrient Film Technique) para la produccin de lechugas (Lactuca spp). UPCH 2.- manual de cultivos hidropnicos populares. Instituto de nutricin de Centroamrica y panam.

22

Das könnte Ihnen auch gefallen