Advertisement
Guest User

Untitled

a guest
Apr 19th, 2015
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.89 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include "opencv/highgui.h"
  4. #include <string.h>
  5. #include "opencv/cv.h"
  6. using namespace std;
  7. using namespace cv;
  8.  
  9. Mat lecturaEscrituraImagen(string nombreImg) {
  10. Mat img; //Variable donde se colocará la imagen
  11. string folderName = "Salida"; //Carpeta donde se guardará la imagen
  12. string folderCreateCommand = "mkdir " + folderName; //comando para crear la carpeta
  13.  
  14. //Lectura de imagen
  15. img = imread(nombreImg);
  16.  
  17. //Escritura de imagen
  18. system(folderCreateCommand.c_str()); //se ejecuta el comando para crear la carpeta Salida
  19. imwrite(folderName + "/" + nombreImg, img); //se guarda la imagen
  20. return img;
  21. }
  22.  
  23. void invertirImagen(Mat img) {
  24. Mat imgInv = img;
  25.  
  26. for (int y = 0; y < img.rows; y++) {
  27. for (int x = 0; x < img.cols; x++) {
  28. Vec3b color = imgInv.at<Vec3b>(Point(x, y)); //Creo variable para acceder al pixel(x,y)
  29. color.val[0] = 255 - color.val[0]; //invierto color
  30. color.val[1] = 255 - color.val[1]; //invierto color
  31. color.val[2] = 255 - color.val[2]; //invierto color
  32. imgInv.at<Vec3b>(Point(x, y)) = color; //asigno el nuevo color a la imagen
  33. }
  34. }
  35. imwrite("Salida/Invert.jpg", imgInv); //Guardo la imagen
  36. }
  37.  
  38. void espejarImagen(Mat img) {
  39. Mat imgEsp = img.clone(); //creo una copia de la imagen original(para obtener una variable con las mismas dimensiones)
  40.  
  41. for (int y = 0; y < img.rows; y++) {
  42. for (int x = 0; x < img.cols; x++) {
  43. Vec3b color = img.at<Vec3b>(Point((img.cols - x), y)); //Creo variable para acceder al pixel(x,y)
  44. imgEsp.at<Vec3b>(Point(x, y)) = color; //asigno el nuevo color a la imagen
  45.  
  46. }
  47. }
  48. imwrite("Salida/Espejo.jpg", imgEsp); //Guardo la imagen
  49. }
  50.  
  51. void calcularHistogramaRGB(Mat img) {
  52. int b = 0, g = 0, r = 0, total, pB, pG, pR;
  53. for (int y = 0; y < img.rows; y++) {
  54. for (int x = 0; x < img.cols; x++) {
  55. Vec3b color = img.at<Vec3b>(Point(x, y));
  56. //conteo de niveles de b(azul), g(verde) y r(rojo)
  57. b += color.val[0];
  58. g += color.val[1];
  59. r += color.val[2];
  60. }
  61. }
  62. //obtengo porcentajes que utilizare para obtener un histograma a escala de 1080x1000 pixeles
  63. total = b + g + r;
  64. pB = 900.0 * b / total;
  65. pG = 900.0 * g / total;
  66. pR = 900.0 * r / total;
  67. //Creo imagen de 1080x1000 pixeles donde se calculará el histograma
  68. Mat imgHisto(Size(900, 900), CV_8UC3);
  69. imgHisto.setTo(Scalar(255,255,255)); //inicializo imagen de color blanco
  70.  
  71. for (int y = 0; y < imgHisto.rows; y++) {
  72. for (int x = 0; x < imgHisto.cols; x++) {
  73. Vec3b color = imgHisto.at<Vec3b>(Point(x, y));
  74. if (10 <= x && x < 290) {
  75. if (y > (900 - pB)) {
  76. color.val[0] = 255;
  77. color.val[1] = 0;
  78. color.val[2] = 0;
  79. }
  80. imgHisto.at<Vec3b>(Point(x, y)) = color;
  81. }
  82. if (310 <= x && x < 590) {
  83. if (y > (900 - pG)) {
  84. color.val[0] = 0;
  85. color.val[1] = 255;
  86. color.val[2] = 0;
  87. }
  88. imgHisto.at<Vec3b>(Point(x, y)) = color;
  89. }
  90. if (610 <= x && x < 890) {
  91. if (y > (900 - pR)) {
  92. color.val[0] = 0;
  93. color.val[1] = 0;
  94. color.val[2] = 255;
  95. }
  96. imgHisto.at<Vec3b>(Point(x, y)) = color;
  97. }
  98. }
  99. }
  100. putText(imgHisto, "Azul", Point(25,890), FONT_HERSHEY_SIMPLEX, 2, Scalar(0,0,0));
  101. putText(imgHisto, "Verde", Point(325,890), FONT_HERSHEY_SIMPLEX, 2, Scalar(0,0,0));
  102. putText(imgHisto, "Rojo", Point(625,890), FONT_HERSHEY_SIMPLEX, 2, Scalar(0,0,0));
  103. imwrite("Salida/histogramaRGB.jpg", imgHisto);
  104. }
  105.  
  106. void calcularHistogramaGray(Mat img) {
  107. //Creo imagen de 1080x1000 pixeles donde se calculará el histograma
  108. Mat imgHisto(Size(900, 900), CV_8UC3);
  109. imgHisto.setTo(Scalar(255,255,255)); //inicializo el histograma de color blanco
  110. unsigned char colorGrayScale;
  111. int white = 0, gray = 0, black = 0, total, pW, pG, pB;
  112.  
  113. for (int y = 0; y < img.rows; y++) {
  114. for (int x = 0; x < img.cols; x++) {
  115. Vec3b color = img.at<Vec3b>(Point(x, y));
  116. //se utiliza el metodo basado en luminosidad para convertir a escala de grises
  117. //se asigna los siguientes pesos: Rojo:0.21, Verde:0.72, Azul:0.07
  118. colorGrayScale = (0.07 * color.val[0])+(0.72 * color.val[1])+(0.21 * color.val[2]);
  119. if (0 <= colorGrayScale && colorGrayScale < 80)
  120. black += colorGrayScale;
  121. if (80 <= colorGrayScale && colorGrayScale < 180)
  122. gray += colorGrayScale;
  123. if (180 <= colorGrayScale && colorGrayScale < 255)
  124. white += colorGrayScale;
  125. }
  126. }
  127. //obtengo porcentajes que utilizare para obtener un histograma a escala de 1080x1000 pixeles
  128. total = white + black + gray;
  129. pW = 900.0 * white / total;
  130. pB = 900.0 * black / total;
  131. pG = 900.0 * gray / total;
  132.  
  133. for (int y = 0; y < imgHisto.rows; y++) {
  134. for (int x = 0; x < imgHisto.cols; x++) {
  135. Vec3b color = imgHisto.at<Vec3b>(Point(x, y));
  136. if (10 <= x && x < 290) {
  137. if (y > (900 - pW)) {
  138. color.val[0] = 0;
  139. color.val[1] = 0;
  140. color.val[2] = 0;
  141. }
  142. imgHisto.at<Vec3b>(Point(x, y)) = color;
  143. }
  144. if (310 <= x && x < 590) {
  145. if (y > (900 - pG)) {
  146. color.val[0] = 0;
  147. color.val[1] = 0;
  148. color.val[2] = 0;
  149. }
  150. imgHisto.at<Vec3b>(Point(x, y)) = color;
  151. }
  152. if (610 <= x && x < 890) {
  153. if (y > (900 - pB)) {
  154. color.val[0] = 0;
  155. color.val[1] = 0;
  156. color.val[2] = 0;
  157. }
  158. imgHisto.at<Vec3b>(Point(x, y)) = color;
  159. }
  160. }
  161. }
  162. putText(imgHisto, "Blanco", Point(25,890), FONT_HERSHEY_SIMPLEX, 2, Scalar(255,255,255));
  163. putText(imgHisto, "Gris", Point(325,890), FONT_HERSHEY_SIMPLEX, 2, Scalar(255,255,255));
  164. putText(imgHisto, "Negro", Point(625,890), FONT_HERSHEY_SIMPLEX, 2, Scalar(255,255,255));
  165. imwrite("Salida/histogramaGray.jpg", imgHisto);
  166. }
  167.  
  168. void calcularHistograma(Mat img, string colorHisto) {
  169. if (colorHisto == "RGB")
  170. calcularHistogramaRGB(img);
  171. else
  172. calcularHistogramaGray(img);
  173. }
  174.  
  175. void caracterizarImagenes() {
  176.  
  177. }
  178.  
  179. void convertirRGBaGray(Mat img) {
  180. for (int y = 0; y < img.rows; y++) {
  181. for (int x = 0; x < img.cols; x++) {
  182. Vec3b color = img.at<Vec3b>(Point(x, y));
  183. //se utiliza el metodo basado en luminosidad para convertir a escala de grises
  184. //se asigna los siguientes pesos: Rojo:0.21, Verde:0.72, Azul:0.07
  185. color.val[0] = (0.07 * color.val[0])+(0.72 * color.val[1])+(0.21 * color.val[2]);
  186. color.val[1] = (0.07 * color.val[0])+(0.72 * color.val[1])+(0.21 * color.val[2]);
  187. color.val[2] = (0.07 * color.val[0])+(0.72 * color.val[1])+(0.21 * color.val[2]);
  188. img.at<Vec3b>(Point(x, y)) = color;
  189. }
  190. }
  191. imshow("Gray", img);
  192. waitKey(0);
  193. }
  194.  
  195. int main() {
  196. string nombreImg = "My Picture.jpg";
  197. Mat img;
  198. img = lecturaEscrituraImagen(nombreImg);
  199.  
  200. //convertirRGBaGray(img);
  201. invertirImagen(img);
  202. espejarImagen(img);
  203.  
  204. string colorHisto = "RGB";
  205. calcularHistograma(img, colorHisto);
  206. calcularHistograma(img, "Grayscale");
  207.  
  208.  
  209. return 0;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement