QT图像处理算法

http://pandownload.com/document/clouddl.html


qq:609162385

.h文件


  
  
  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3. #include <QMainWindow>
  4. #include <QSpinBox>
  5. #include <QPushButton>
  6. #include <QImage>
  7. #include <QDoubleSpinBox>
  8. namespace Ui {
  9. class MainWindow;
  10. }
  11. class MainWindow : public QMainWindow
  12. {
  13. Q_OBJECT
  14. public:
  15. explicit MainWindow(QWidget *parent = 0);
  16. ~MainWindow();
  17. void imageSharpening();
  18. void imageGray();
  19. QImage qImageToGray();
  20. void YanMo2(int *tmpPixel, int width, int height);
  21. void YanMo1(int *tmpPixel, int width, int height);
  22. void MoreClearPic(QRgb *tmpPixel,int yanKind,int width,int height);
  23. void DecreseVoice();
  24. void SobelGet();
  25. void Template(QImage &SobelImage);
  26. QImage * saturation(int delta, QImage * origin);
  27. QImage * blur(QImage * origin);
  28. QImage * sharpen(QImage * origin);
  29. void cool();
  30. void brightness();
  31. void directionalGray();
  32. void filter();
  33. void define(QImage);
  34. void MakePicAverage();
  35. private:
  36. Ui::MainWindow *ui;
  37. QImage *image;
  38. };
  39. #endif // MAINWINDOW_H


.cpp文件


  
  
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QDebug>
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui( new Ui::MainWindow)
  7. {
  8. ui->setupUi( this);
  9. QImage aImage = qImageToGray();
  10. define(aImage);
  11. //MakePicAverage();
  12. //brightness();
  13. //imageSharpening();
  14. //imageGray();
  15. //filter();
  16. //directionalGray();
  17. }
  18. MainWindow::~MainWindow()
  19. {
  20. delete ui;
  21. }
  22. //图像锐化
  23. void MainWindow::imageSharpening()
  24. {
  25. int betterValue = 5;
  26. image = new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\piliexian.jpg");
  27. QImage ImageBetter;
  28. ImageBetter = QImage(image->width(),image->height(),QImage::Format_ARGB32);
  29. int i,j;
  30. int r,g,b,tmpR,tmpG,tmpB;
  31. QRgb rgb00,rgb01,rgb10;
  32. int width = image->width();
  33. int height = image->height();
  34. for(i = 0;i < width;i++)
  35. {
  36. for(j = 0;j < height;j++)
  37. {
  38. if(image->valid(i,j)&&image->valid(i+ 1,j)&&image->valid(i,j+ 1))
  39. {
  40. rgb00 = image->pixel(i,j); //获取rgb
  41. rgb01 = image->pixel(i,j+ 1);
  42. rgb10 = image->pixel(i+ 1,j);
  43. r = qRed(rgb00);
  44. g = qGreen(rgb00);
  45. b = qBlue(rgb00);
  46. tmpR = abs(qRed(rgb00)-qRed(rgb01))+ abs(qRed(rgb00)-qRed(rgb10));
  47. tmpG = abs(qGreen(rgb00)-qGreen(rgb01))+ abs(qGreen(rgb00)-qGreen(rgb10));
  48. tmpB = abs(qBlue(rgb00)-qBlue(rgb01))+ abs(qBlue(rgb00)-qBlue(rgb10));
  49. if((tmpR+ 120) < 255)
  50. {
  51. if(tmpR > betterValue)
  52. {
  53. r = tmpR+ 120;
  54. }
  55. }
  56. else
  57. {
  58. r = 255;
  59. }
  60. if((tmpG + 120) < 255)
  61. {
  62. if(tmpG > betterValue)
  63. {
  64. g = tmpG+ 120;
  65. }
  66. }
  67. else
  68. {
  69. g = 255;
  70. }
  71. if((tmpB + 120) < 255)
  72. {
  73. if(tmpB > betterValue)
  74. {
  75. b = tmpB+ 120;
  76. }
  77. }
  78. else
  79. {
  80. b = 255;
  81. }
  82. ImageBetter.setPixel(i,j,qRgb(r,g,b));
  83. }
  84. }
  85. }
  86. ui->label_2->resize(ImageBetter.width(),ImageBetter.height());
  87. ui->label_2->setPixmap(QPixmap::fromImage(ImageBetter));
  88. }
  89. //转灰度图
  90. QImage MainWindow::qImageToGray()
  91. {
  92. image = new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\timg.jpg");
  93. int height = image->height();
  94. int width = image->width();
  95. QImage ret(width, height, QImage::Format_Indexed8);
  96. ret.setColorCount( 256);
  97. for( int i = 0; i < 256; i++)
  98. {
  99. ret.setColor(i, qRgb(i, i, i));
  100. }
  101. switch(image->format())
  102. {
  103. case QImage::Format_Indexed8:
  104. for( int i = 0; i < height; i ++)
  105. {
  106. const uchar *pSrc = (uchar *)image->constScanLine(i);
  107. uchar *pDest = (uchar *)ret.scanLine(i);
  108. memcpy(pDest, pSrc, width);
  109. }
  110. break;
  111. case QImage::Format_RGB32:
  112. case QImage::Format_ARGB32:
  113. case QImage::Format_ARGB32_Premultiplied:
  114. for( int i = 0; i < height; i ++)
  115. {
  116. const QRgb *pSrc = (QRgb *)image->constScanLine(i);
  117. uchar *pDest = (uchar *)ret.scanLine(i);
  118. for( int j = 0; j < width; j ++)
  119. {
  120. pDest[j] = qGray(pSrc[j]);
  121. }
  122. }
  123. break;
  124. }
  125. return ret;
  126. }
  127. //饱和度
  128. void MainWindow::cool()
  129. {
  130. int delta = 30;
  131. image = new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\timg.jpg");
  132. QImage *newImage = new QImage(image->width(), image->height(), QImage::Format_ARGB32);
  133. QColor oldColor;
  134. int r,g,b;
  135. for( int x= 0; x<newImage->width(); x++){
  136. for( int y= 0; y<newImage->height(); y++){
  137. oldColor = QColor(image->pixel(x,y));
  138. r = oldColor.red() + delta;
  139. g = oldColor.green() + delta;
  140. b = oldColor.blue();
  141. //we check if the new values are between 0 and 255
  142. // r = qBound(0, r, 255);
  143. // g = qBound(0, g, 255);
  144. b = qBound( 0, b, 255);
  145. newImage->setPixel(x,y, qRgb(r,g,b));
  146. }
  147. }
  148. ui->label_2->resize(newImage->width(),newImage->height());
  149. ui->label_2->setPixmap(QPixmap::fromImage(*newImage));
  150. }
  151. //饱和度
  152. QImage * MainWindow::saturation( int delta, QImage * origin){
  153. QImage * newImage = new QImage(origin->width(), origin->height(), QImage::Format_ARGB32);
  154. QColor oldColor;
  155. QColor newColor;
  156. int h,s,l;
  157. for( int x= 0; x<newImage->width(); x++){
  158. for( int y= 0; y<newImage->height(); y++){
  159. oldColor = QColor(origin->pixel(x,y));
  160. newColor = oldColor.toHsl();
  161. h = newColor.hue();
  162. s = newColor.saturation()+delta;
  163. l = newColor.lightness();
  164. //we check if the new value is between 0 and 255
  165. s = qBound( 0, s, 255);
  166. newColor.setHsl(h, s, l);
  167. newImage->setPixel(x, y, qRgb(newColor.red(), newColor.green(), newColor.blue()));
  168. }
  169. }
  170. return newImage;
  171. }
  172. //模糊
  173. QImage * MainWindow::blur(QImage * origin){
  174. QImage * newImage = new QImage(*origin);
  175. int kernel [ 5][ 5]= {{ 0, 0, 1, 0, 0},
  176. { 0, 1, 3, 1, 0},
  177. { 1, 3, 7, 3, 1},
  178. { 0, 1, 3, 1, 0},
  179. { 0, 0, 1, 0, 0}};
  180. int kernelSize = 5;
  181. int sumKernel = 27;
  182. int r,g,b;
  183. QColor color;
  184. for( int x=kernelSize/ 2; x<newImage->width()-(kernelSize/ 2); x++){
  185. for( int y=kernelSize/ 2; y<newImage->height()-(kernelSize/ 2); y++){
  186. r = 0;
  187. g = 0;
  188. b = 0;
  189. for( int i = -kernelSize/ 2; i<= kernelSize/ 2; i++){
  190. for( int j = -kernelSize/ 2; j<= kernelSize/ 2; j++){
  191. color = QColor(origin->pixel(x+i, y+j));
  192. r += color.red()*kernel[kernelSize/ 2+i][kernelSize/ 2+j];
  193. g += color.green()*kernel[kernelSize/ 2+i][kernelSize/ 2+j];
  194. b += color.blue()*kernel[kernelSize/ 2+i][kernelSize/ 2+j];
  195. }
  196. }
  197. r = qBound( 0, r/sumKernel, 255);
  198. g = qBound( 0, g/sumKernel, 255);
  199. b = qBound( 0, b/sumKernel, 255);
  200. newImage->setPixel(x,y, qRgb(r,g,b));
  201. }
  202. }
  203. return newImage;
  204. }
  205. //锐化
  206. QImage * MainWindow::sharpen(QImage * origin){
  207. QImage * newImage = new QImage(* origin);
  208. int kernel [ 3][ 3]= {{ 0, -1, 0},
  209. { -1, 5, -1},
  210. { 0, -1, 0}};
  211. int kernelSize = 3;
  212. int sumKernel = 1;
  213. int r,g,b;
  214. QColor color;
  215. for( int x=kernelSize/ 2; x<newImage->width()-(kernelSize/ 2); x++){
  216. for( int y=kernelSize/ 2; y<newImage->height()-(kernelSize/ 2); y++){
  217. r = 0;
  218. g = 0;
  219. b = 0;
  220. for( int i = -kernelSize/ 2; i<= kernelSize/ 2; i++){
  221. for( int j = -kernelSize/ 2; j<= kernelSize/ 2; j++){
  222. color = QColor(origin->pixel(x+i, y+j));
  223. r += color.red()*kernel[kernelSize/ 2+i][kernelSize/ 2+j];
  224. g += color.green()*kernel[kernelSize/ 2+i][kernelSize/ 2+j];
  225. b += color.blue()*kernel[kernelSize/ 2+i][kernelSize/ 2+j];
  226. }
  227. }
  228. r = qBound( 0, r/sumKernel, 255);
  229. g = qBound( 0, g/sumKernel, 255);
  230. b = qBound( 0, b/sumKernel, 255);
  231. newImage->setPixel(x,y, qRgb(r,g,b));
  232. }
  233. }
  234. return newImage;
  235. }
  236. //亮度调节
  237. void MainWindow::brightness()
  238. {
  239. int delta = 30;
  240. image = new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\timg.jpg");
  241. QImage *newImage = new QImage(image->width(), image->height(), QImage::Format_ARGB32);
  242. QColor oldColor;
  243. int r,g,b;
  244. for( int x= 0; x<newImage->width(); x++){
  245. for( int y= 0; y<newImage->height(); y++){
  246. oldColor = QColor(image->pixel(x,y));
  247. r = oldColor.red() + delta;
  248. g = oldColor.green() + delta;
  249. b = oldColor.blue();
  250. //we check if the new values are between 0 and 255
  251. r = qBound( 0, r, 255);
  252. g = qBound( 0, g, 255);
  253. newImage->setPixel(x,y, qRgb(r,g,b));
  254. }
  255. }
  256. ui->label_2->resize(newImage->width(),newImage->height());
  257. ui->label_2->setPixmap(QPixmap::fromImage(*newImage));
  258. }
  259. //灰度
  260. void MainWindow::directionalGray()
  261. {
  262. image= new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\people.jpg");
  263. QImage ImageBetter;
  264. ImageBetter = QImage(image->width(),image->height(),QImage::Format_ARGB32);
  265. int i,j;
  266. int r,g,b;
  267. QRgb rgb00,rgb01,rgb10;
  268. int width = image->width();
  269. int height = image->height();
  270. int threshold = 200;
  271. for(i = 0;i<width;i++)
  272. {
  273. int ta = 0, tr = 0, tg = 0, tb = 0;
  274. for(j = 0;j < height;j++)
  275. {
  276. if(image->valid(i,j)&&image->valid(i+ 1,j)&&image->valid(i,j+ 1))
  277. {
  278. rgb00 = image->pixel(i,j); //获取rgb
  279. ta = (rgb00 >> 24) & 0xff;
  280. tr = (rgb00 >> 16) & 0xff;
  281. tg = (rgb00 >> 8) & 0xff;
  282. tb = rgb00 & 0xff;
  283. int gray = ( int)( 0.299 * ( double)tr + 0.587 * ( double)tg + 0.114 * ( double)tb);
  284. double distance = qRgb(tr, tg, tb);
  285. if(distance < threshold) {
  286. rgb01 = qRgba(tr, tg, tb, gray);
  287. tr = qRed(rgb01);
  288. tg = qGreen(rgb01);
  289. tb = qBlue(rgb01);
  290. rgb10 = (ta << 24) | (tr << 16) | (tg << 8) | tb;
  291. r = qRed(rgb10);
  292. g = qGreen(rgb10);
  293. b = qBlue(rgb10);
  294. ImageBetter.setPixel(i,j,qRgb(r,g,b));
  295. }
  296. else {
  297. rgb10 = (ta << 24) | (gray << 16) | (gray << 8) | gray;
  298. r = qRed(rgb10);
  299. g = qGreen(rgb10);
  300. b = qBlue(rgb10);
  301. ImageBetter.setPixel(i,j,qRgb(r,g,b));
  302. }
  303. //qRgba
  304. }
  305. }
  306. }
  307. ui->label_2->resize(ImageBetter.width(),ImageBetter.height());
  308. ui->label_2->setPixmap(QPixmap::fromImage(ImageBetter));
  309. }
  310. //二值化
  311. void MainWindow::filter()
  312. {
  313. image= new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\timg.jpg");
  314. QImage ImageBetter;
  315. ImageBetter = QImage(image->width(),image->height(),QImage::Format_ARGB32);
  316. int i,j;
  317. int r,g,b;
  318. QRgb rgb00,rgb01;
  319. int width = image->width();
  320. int height = image->height();
  321. double total = height * width;
  322. double redSum = 0, greenSum = 0, blueSum = 0;
  323. for(i = 0;i<width;i++)
  324. {
  325. int ta = 0, tr = 0, tg = 0, tb = 0;
  326. for(j = 0;j < height;j++)
  327. {
  328. if(image->valid(i,j)&&image->valid(i+ 1,j)&&image->valid(i,j+ 1))
  329. {
  330. rgb00 = image->pixel(i,j); //获取rgb
  331. ta = (rgb00 >> 24) & 0xff;
  332. tr = (rgb00 >> 16) & 0xff;
  333. tg = (rgb00 >> 8) & 0xff;
  334. tb = rgb00 & 0xff;
  335. redSum += tr;
  336. greenSum += tg;
  337. blueSum +=tb;
  338. }
  339. }
  340. }
  341. int means = ( int)(redSum / total); //获取阈值
  342. #ifdef QT_DEBUG
  343. means = 225;
  344. #else
  345. #endif
  346. qDebug()<<means;
  347. //
  348. for(i = 0;i<width;i++)
  349. {
  350. int ta = 0, tr = 0, tg = 0, tb = 0;
  351. for(j = 0;j < height;j++)
  352. {
  353. if(image->valid(i,j)&&image->valid(i+ 1,j)&&image->valid(i,j+ 1))
  354. {
  355. rgb00 = image->pixel(i,j); //获取rgb
  356. ta = (rgb00 >> 24) & 0xff;
  357. tr = (rgb00 >> 16) & 0xff;
  358. tg = (rgb00 >> 8) & 0xff;
  359. tb = rgb00 & 0xff;
  360. if(tr >=means) {
  361. tr = tg = tb = 255;
  362. } else {
  363. tr = tg = tb = 0;
  364. }
  365. rgb01 = (ta << 24) | (tr << 16) | (tg << 8) | tb;
  366. r = qRed(rgb01);
  367. g = qGreen(rgb01);
  368. b = qBlue(rgb01);
  369. ImageBetter.setPixel(i,j,qRgb(r,g,b));
  370. }
  371. }
  372. }
  373. ui->label_2->resize(ImageBetter.width(),ImageBetter.height());
  374. ui->label_2->setPixmap(QPixmap::fromImage(ImageBetter));
  375. }
  376. //自定义
  377. void MainWindow::define(QImage img)
  378. {
  379. QImage ImageBetter;
  380. ImageBetter = QImage(image->width(),image->height(),QImage::Format_ARGB32);
  381. int i,j;
  382. int r,g,b;
  383. QRgb rgb00,rgb01,rgb10;
  384. int width = image->width();
  385. int height = image->height();
  386. char up[ 200000] = { 0};
  387. char down[ 200000] = { 0};
  388. int upCount = 0,downCount = 0;
  389. bool state = false;
  390. int jNum = 0;
  391. bool jstate = false;
  392. double upNum = 0;
  393. double downNum = 0;
  394. int ret = 0;
  395. for(i = 150;i < width - 150;i++)
  396. {
  397. int ta = 0, tr = 0,tr1 = 0, tg = 0, tb = 0;
  398. for(j = 150;j < height - 150;j++)
  399. {
  400. if(image->valid(i,j)&&image->valid(i+ 1,j)&&image->valid(i,j+ 1))
  401. {
  402. char count = 0;
  403. rgb00 = image->pixel(i,j);
  404. tr = (rgb00 >> 16) & 0xff;
  405. for( int m = -15;m < 15; m++)
  406. {
  407. rgb10 = image->pixel(i + m,j);
  408. tr1 = (rgb10 >> 16) & 0xff;
  409. char ch = tr - tr1;
  410. if(ch >= -1 || ch <= 1)
  411. {
  412. count++;
  413. }
  414. }
  415. for( int n = -15;n < 15; n++)
  416. {
  417. rgb10 = image->pixel(i,j + n);
  418. tr1 = (rgb10 >> 16) & 0xff;
  419. if(tr == tr1)
  420. {
  421. count++;
  422. }
  423. }
  424. if(count > 50)
  425. {
  426. tr = tg = tb = 255;
  427. if(jstate == false)
  428. {
  429. jstate = true;
  430. jNum = j;
  431. }
  432. if(j - jNum > 20)
  433. {
  434. state = true;
  435. }
  436. jNum = j;
  437. if(state == false)
  438. {
  439. up[upCount++] = i;
  440. }
  441. else
  442. {
  443. down[downCount++] = i;
  444. }
  445. }
  446. else
  447. {
  448. tr = tg = tb = 0;
  449. }
  450. rgb01 = (ta << 24) | (tr << 16) | (tg << 8) | tb;
  451. r = qRed(rgb01);
  452. g = qGreen(rgb01);
  453. b = qBlue(rgb01);
  454. ImageBetter.setPixel(i,j,qRgb(r,g,b));
  455. }
  456. }
  457. }
  458. for( int ic = 0;ic < upCount;ic++)
  459. {
  460. upNum += up[ic];
  461. }
  462. for( int jc = 0;jc < downCount;jc++)
  463. {
  464. downNum += down[jc];
  465. }
  466. ret = upNum / upCount - downNum / downCount;
  467. qDebug()<< ret;
  468. ui->label_2->resize(ImageBetter.width(),ImageBetter.height());
  469. ui->label_2->setPixmap(QPixmap::fromImage(ImageBetter));
  470. }
  471. //转灰度
  472. void MainWindow::imageGray()
  473. {
  474. image= new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\1.jpg");
  475. QImage ImageBetter;
  476. ImageBetter = QImage(image->width(),image->height(),QImage::Format_ARGB32);
  477. int i,j;
  478. int r,g,b;
  479. QRgb rgb00,rgb01;
  480. int width = image->width();
  481. int height = image->height();
  482. for(i = 0;i<width;i++)
  483. {
  484. for(j = 0;j < height;j++)
  485. {
  486. if(image->valid(i,j)&&image->valid(i+ 1,j)&&image->valid(i,j+ 1))
  487. {
  488. rgb00 = image->pixel(i,j); //获取rgb
  489. #ifdef QT_DEBUG
  490. unsigned int blue = (rgb00 & 0x000000FF)>> 0;
  491. unsigned int green = (rgb00 & 0x0000FF00) >> 8;
  492. unsigned int red = (rgb00 & 0x00FF0000) >> 16;
  493. #else
  494. unsigned int blue = (rgb00 >> 0) & 0xff;
  495. unsigned int green = (rgb00 >> 8) & 0xff;
  496. unsigned int red = (rgb00 >> 16) & 0xff;
  497. #endif
  498. rgb01 = ( red* 38 + green * 75 + blue * 15 )>> 7;
  499. //qDebug()<<rgb01;
  500. r = qRed(rgb01);
  501. g = qGreen(rgb01);
  502. b = qBlue(rgb01);
  503. ImageBetter.setPixel(i,j,qRgb(r,g,b));
  504. }
  505. }
  506. }
  507. ui->label_2->resize(ImageBetter.width(),ImageBetter.height());
  508. ui->label_2->setPixmap(QPixmap::fromImage(ImageBetter));
  509. }
  510. //直方图均衡化
  511. void MainWindow::MakePicAverage()
  512. {
  513. image = new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\timg.jpg");
  514. QImage ImageAverage;
  515. ImageAverage=QImage(image->width(),image->height(),QImage::Format_ARGB32);
  516. int i,j;
  517. int width,height;
  518. width=image->width();
  519. height=image->height();
  520. QRgb rgb;
  521. int r[ 256],g[ 256],b[ 256]; //原图各个灰度数量的统计
  522. int rtmp,gtmp,btmp,rj,gj,bj;
  523. float rPro[ 256],gPro[ 256],bPro[ 256]; //原图各个灰度级的概率
  524. float rTemp[ 256],gTemp[ 256],bTemp[ 256]; //均衡化后各个灰度级的概率
  525. int rJun[ 256],gJun[ 256],bJun[ 256]; //均衡化后对应像素的值
  526. memset(r, 0, sizeof(r));
  527. memset(g, 0, sizeof(g));
  528. memset(b, 0, sizeof(b));
  529. //获取原图各个灰度的数量
  530. for(i= 0;i<width;i++)
  531. {
  532. for(j= 0;j<height;j++)
  533. {
  534. rgb=image->pixel(i,j);
  535. r[qRed(rgb)]++;
  536. g[qGreen(rgb)]++;
  537. b[qBlue(rgb)]++;
  538. }
  539. }
  540. //获取原图各个灰度级的概率
  541. for(i= 0;i< 256;i++)
  542. {
  543. rPro[i]=(r[i]* 1.0)/(width*height);
  544. gPro[i]=(g[i]* 1.0)/(width*height);
  545. bPro[i]=(b[i]* 1.0)/(width*height);
  546. }
  547. //均衡化后各个灰度级的概率,同时获取均衡化后对应像素的值
  548. for(i= 0;i< 256;i++)
  549. {
  550. if(i== 0)
  551. {
  552. rTemp[ 0]=rPro[ 0];
  553. gTemp[ 0]=gPro[ 0];
  554. bTemp[ 0]=bPro[ 0];
  555. }
  556. else
  557. {
  558. rTemp[i]=rTemp[i -1]+rPro[i];
  559. gTemp[i]=gTemp[i -1]+gPro[i];
  560. bTemp[i]=bTemp[i -1]+bPro[i];
  561. }
  562. rJun[i]=( int)( 255*rTemp[i]+ 0.5);
  563. gJun[i]=( int)( 255*gTemp[i]+ 0.5);
  564. bJun[i]=( int)( 255*bTemp[i]+ 0.5);
  565. }
  566. for(i= 0;i<width;i++)
  567. {
  568. for(j= 0;j<height;j++)
  569. {
  570. rgb=image->pixel(i,j);
  571. rtmp=qRed(rgb);
  572. gtmp=qGreen(rgb);
  573. btmp=qBlue(rgb);
  574. rj=rJun[rtmp];
  575. gj=gJun[gtmp];
  576. bj=bJun[btmp];
  577. ImageAverage.setPixel(i,j,qRgb(rj,gj,bj));
  578. }
  579. }
  580. ui->label_2->resize(ImageAverage.width(),ImageAverage.height());
  581. ui->label_2->setPixmap(QPixmap::fromImage(ImageAverage));
  582. delete image;
  583. }
  584. //Sobel算子提取图像边界
  585. void MainWindow::SobelGet()
  586. {
  587. image = new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\timg.jpg");
  588. QImage SobelIma;
  589. SobelIma=QImage(image->width(),image->height(),QImage::Format_ARGB32);
  590. Template(SobelIma);
  591. ui->label_2->resize(SobelIma.width(),SobelIma.height());
  592. ui->label_2->setPixmap(QPixmap::fromImage(SobelIma));
  593. }
  594. //与算子进行卷积的函数
  595. void MainWindow::Template(QImage &SobelImage)
  596. {
  597. int width=image->width(),height=image->height();
  598. int pixelNum=width*height;
  599. int i,j,k,l;
  600. float rResult,gResult,bResult;
  601. float sobel1[ 9]={ 1, 2, 1, 0, 0, 0, -1, -2, -1},sobel2[ 9]={ 1, 0, -1, 2, 0, -2, 1, 0, -1};
  602. QRgb pixelOld[pixelNum],pixelTemp1[pixelNum],pixelTemp2[pixelNum];
  603. int rtmp,gtmp,btmp;
  604. memset(pixelTemp1, 255,pixelNum);
  605. memset(pixelTemp2, 255,pixelNum);
  606. QRgb tmpRgb;
  607. for(j= 0;j<height;j++)
  608. {
  609. for(i= 0;i<width;i++)
  610. {
  611. tmpRgb=image->pixel(i,j);
  612. pixelOld[j*width+i]=tmpRgb;
  613. }
  614. }
  615. for(j= 1;j<height -1;j++)
  616. {
  617. for(i= 1;i<width -1;i++)
  618. {
  619. rResult= 0;
  620. gResult= 0;
  621. bResult= 0;
  622. for(k= 0;k< 3;k++)
  623. {
  624. for(l= 0;l< 3;l++)
  625. {
  626. rResult+=qRed(pixelOld[(j -1+k)*width+(i -1+l)])*sobel1[k* 3+l];
  627. gResult+=qGreen(pixelOld[(j -1+k)*width+(i -1+l)])*sobel1[k* 3+l];
  628. bResult+=qBlue(pixelOld[(j -1+k)*width+(i -1+l)])*sobel1[k* 3+l];
  629. }
  630. }
  631. rResult=( float) fabs(rResult);
  632. gResult=( float) fabs(gResult);
  633. bResult=( float) fabs(bResult);
  634. if(rResult> 255)
  635. {
  636. rtmp= 255;
  637. }
  638. else
  639. rtmp=( int)(rResult+ 0.5);
  640. if(gResult> 255)
  641. gtmp= 255;
  642. else
  643. gtmp=( int)(gResult+ 0.5);
  644. if(bResult> 255)
  645. btmp= 255;
  646. else
  647. btmp=( int)(bResult+ 0.5);
  648. pixelTemp1[j*width+i]=qRgb(rtmp,gtmp,btmp);
  649. }
  650. }
  651. for(j= 1;j<height -1;j++)
  652. {
  653. for(i= 1;i<width -1;i++)
  654. {
  655. rResult= 0;
  656. gResult= 0;
  657. bResult= 0;
  658. for(k= 0;k< 3;k++)
  659. {
  660. for(l= 0;l< 3;l++)
  661. {
  662. rResult+=qRed(pixelOld[(j -1+k)*width+(i -1+l)])*sobel2[k* 3+l];
  663. gResult+=qGreen(pixelOld[(j -1+k)*width+(i -1+l)])*sobel2[k* 3+l];
  664. bResult+=qBlue(pixelOld[(j -1+k)*width+(i -1+l)])*sobel2[k* 3+l];
  665. }
  666. }
  667. rResult=( float) fabs(rResult);
  668. gResult=( float) fabs(gResult);
  669. bResult=( float) fabs(bResult);
  670. if(rResult> 255)
  671. rtmp= 255;
  672. else
  673. rtmp=( int)(rResult+ 0.5);
  674. if(gResult> 255)
  675. gtmp= 255;
  676. else
  677. gtmp=( int)(gResult+ 0.5);
  678. if(bResult> 255)
  679. btmp= 255;
  680. else
  681. btmp=( int)(bResult+ 0.5);
  682. pixelTemp2[j*width+i]=qRgb(rtmp,gtmp,btmp);
  683. }
  684. }
  685. for(i= 0;i<pixelNum;i++)
  686. {
  687. if(pixelTemp2[i]>pixelTemp1[i])
  688. pixelTemp1[i]=pixelTemp2[i];
  689. }
  690. for(j= 0;j<height;j++)
  691. {
  692. for(i= 0;i<width;i++)
  693. {
  694. SobelImage.setPixel(i,j,pixelTemp1[j*width+i]);
  695. }
  696. }
  697. delete[] pixelTemp1;
  698. delete[] pixelTemp2;
  699. delete image;
  700. }
  701. //将图像的像素信息存在缓存中,并通过调用图像平滑函数更改缓存中的信息
  702. void MainWindow::DecreseVoice()
  703. {
  704. image = new QImage( "C:\\Users\\Administrator\\Desktop\\QTsucai\\timg.jpg");
  705. int i,j,k,num;
  706. int width=image->width(),height=image->height();
  707. QImage MoreClear;
  708. MoreClear=QImage(width,height,QImage::Format_ARGB32);
  709. num=width*height;
  710. QRgb tmpPixel[num];
  711. int yanKind = 125;
  712. for(i= 0;i<width;i++)
  713. {
  714. for(j= 0;j<height;j++)
  715. {
  716. k=i*height+j;
  717. tmpPixel[k]=image->pixel(i,j);
  718. }
  719. }
  720. MoreClearPic(tmpPixel,yanKind,width,height);
  721. for(i= 0;i<width;i++)
  722. {
  723. for(j= 0;j<height;j++)
  724. {
  725. k=i*height+j;
  726. MoreClear.setPixel(i,j,tmpPixel[k]);
  727. }
  728. }
  729. ui->label_2->resize(width,height);
  730. ui->label_2->setPixmap(QPixmap::fromImage(MoreClear));
  731. }
  732. //,图形平滑函数,它通过调用相应的平滑化函数实现图像的不同平滑化
  733. void MainWindow::MoreClearPic(QRgb *tmpPixel, int yanKind, int width, int height)
  734. {
  735. int i,j,k;
  736. int num=width*height;
  737. int rtmpPixel[num],gtmpPixel[num],btmpPixel[num];
  738. for(i= 0;i<width;i++)
  739. {
  740. for(j= 0;j<height;j++)
  741. {
  742. k=i*height+j;
  743. rtmpPixel[k]=qRed(tmpPixel[k]);
  744. gtmpPixel[k]=qGreen(tmpPixel[k]);
  745. btmpPixel[k]=qBlue(tmpPixel[k]);
  746. }
  747. }
  748. if(yanKind== 1)
  749. {
  750. YanMo1(rtmpPixel,width,height);
  751. YanMo1(gtmpPixel,width,height);
  752. YanMo1(btmpPixel,width,height);
  753. }
  754. if(yanKind== 2)
  755. {
  756. YanMo2(rtmpPixel,width,height);
  757. YanMo2(gtmpPixel,width,height);
  758. YanMo2(btmpPixel,width,height);
  759. }
  760. /*if(yanKind==3)
  761. {
  762. YanMo3(rtmpPixel,width,height);
  763. YanMo3(gtmpPixel,width,height);
  764. YanMo3(btmpPixel,width,height);
  765. }*/
  766. for(i= 1;i<width -1;i++)
  767. {
  768. for(j= 1;j<height -1;j++)
  769. {
  770. k=i*height+j;
  771. tmpPixel[k]=qRgb(rtmpPixel[k],gtmpPixel[k],btmpPixel[k]);
  772. }
  773. }
  774. }
  775. //邻域平均法平滑化函数
  776. void MainWindow::YanMo1( int *tmpPixel, int width, int height)
  777. {
  778. float Template[ 9]={ 1.0/ 9, 1.0/ 9, 1.0/ 9, 1.0/ 9, 1.0/ 9, 1.0/ 9, 1.0/ 9, 1.0/ 9, 1.0/ 9};
  779. int i,j;
  780. for(i= 1;i<width -1;i++)
  781. {
  782. for(j= 1;j<height -1;j++)
  783. {
  784. tmpPixel[i*height+j]=tmpPixel[(i -1)*height+j -1]*Template[ 0]+tmpPixel[(i -1)*height+j]*Template[ 1]+
  785. tmpPixel[(i -1)*height+j+ 1]*Template[ 2]+tmpPixel[i*height+j -1]*Template[ 3]+tmpPixel[i*height+j]*Template[ 4]
  786. +tmpPixel[i*height+j+ 1]*Template[ 5]+tmpPixel[(i+ 1)*height+j -1]*Template[ 6]+tmpPixel[(i+ 1)*height+j]*Template[ 7]
  787. +tmpPixel[(i+ 1)*height+j+ 1]*Template[ 8];
  788. }
  789. }
  790. }
  791. //加权平均法平滑化函数
  792. void MainWindow::YanMo2( int *tmpPixel, int width, int height)
  793. {
  794. float Template[ 9]={ 1.0/ 16, 2.0/ 16, 1.0/ 16, 2.0/ 16, 4.0/ 16, 2.0/ 16, 1.0/ 16, 2.0/ 16, 1.0/ 16};
  795. int i,j;
  796. for(i= 1;i<width -1;i++)
  797. {
  798. for(j= 1;j<height -1;j++)
  799. {
  800. tmpPixel[i*height+j]=tmpPixel[(i -1)*height+j -1]*Template[ 0]+tmpPixel[(i -1)*height+j]*Template[ 1]+
  801. tmpPixel[(i -1)*height+j+ 1]*Template[ 2]+tmpPixel[i*height+j -1]*Template[ 3]+tmpPixel[i*height+j]*Template[ 4]
  802. +tmpPixel[i*height+j+ 1]*Template[ 5]+tmpPixel[(i+ 1)*height+j -1]*Template[ 6]+tmpPixel[(i+ 1)*height+j]*Template[ 7]
  803. +tmpPixel[(i+ 1)*height+j+ 1]*Template[ 8];
  804. }
  805. }
  806. }

 

 

发布了8 篇原创文章 · 获赞 3 · 访问量 1927

猜你喜欢

转载自blog.csdn.net/weixin_44017727/article/details/100170051