Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // OpenCVApplication.cpp : Defines the entry point for the console application.
- //
- #include "stdafx.h"
- #include "common.h"
- #include <vector>
- #include <math.h>
- #include <queue>
- #include <utility>
- #include <unordered_map>
- #include <random>
- #include <time.h>
- #include <fstream>
- using namespace std;
- #define max(a,b)(((a)>(b))?(a):(b))
- #define min(a,b)(((a)<(b))?(a):(b))
- int n;
- int histValues[256];
- float normalizedHistoValues[256];
- int result[256];
- void testOpenImage()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src;
- src = imread(fname);
- imshow("image", src);
- waitKey(0);
- }
- }
- void testOpenImagesFld()
- {
- char folderName[MAX_PATH];
- if (openFolderDlg(folderName) == 0)
- return;
- char fname[MAX_PATH];
- FileGetter fg(folderName, "bmp");
- while (fg.getNextAbsFile(fname))
- {
- Mat src;
- src = imread(fname);
- imshow(fg.getFoundFileName(), src);
- if (waitKey(0) == 27) //ESC pressed
- break;
- }
- }
- void testImageOpenAndSave()
- {
- Mat src, dst;
- src = imread("Images/Lena_24bits.bmp", CV_LOAD_IMAGE_COLOR); // Read the image
- if (!src.data) // Check for invalid input
- {
- printf("Could not open or find the image\n");
- return;
- }
- // Get the image resolution
- Size src_size = Size(src.cols, src.rows);
- // Display window
- const char* WIN_SRC = "Src"; //window for the source image
- namedWindow(WIN_SRC, CV_WINDOW_AUTOSIZE);
- cvMoveWindow(WIN_SRC, 0, 0);
- const char* WIN_DST = "Dst"; //window for the destination (processed) image
- namedWindow(WIN_DST, CV_WINDOW_AUTOSIZE);
- cvMoveWindow(WIN_DST, src_size.width + 10, 0);
- cvtColor(src, dst, CV_BGR2GRAY); //converts the source image to a grayscale one
- imwrite("Images/Lena_24bits_gray.bmp", dst); //writes the destination to file
- imshow(WIN_SRC, src);
- imshow(WIN_DST, dst);
- printf("Press any key to continue ...\n");
- waitKey(0);
- }
- void testNegativeImage()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- double t = (double)getTickCount(); // Get the current time [s]
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int height = src.rows;
- int width = src.cols;
- Mat dst = Mat(height, width, CV_8UC1);
- // Asa se acceseaaza pixelii individuali pt. o imagine cu 8 biti/pixel
- // Varianta ineficienta (lenta)
- for (int i = 0; i < height; i++)
- {
- for (int j = 0; j < width; j++)
- {
- uchar val = src.at<uchar>(i, j);
- uchar neg = MAX_PATH - val;
- dst.at<uchar>(i, j) = neg;
- }
- }
- // Get the current time again and compute the time difference [s]
- t = ((double)getTickCount() - t) / getTickFrequency();
- // Print (in the console window) the processing time in [ms]
- printf("Time = %.3f [ms]\n", t * 1000);
- imshow("input image", src);
- imshow("negative image", dst);
- waitKey(0);
- }
- }
- void testParcurgereSimplaDiblookStyle()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int height = src.rows;
- int width = src.cols;
- Mat dst = src.clone();
- double t = (double)getTickCount(); // Get the current time [s]
- // the fastest approach using the “diblook style”
- uchar *lpSrc = src.data;
- uchar *lpDst = dst.data;
- int w = (int)src.step; // no dword alignment is done !!!
- for (int i = 0; i < height; i++)
- for (int j = 0; j < width; j++) {
- uchar val = lpSrc[i*w + j];
- lpDst[i*w + j] = 255 - val;
- }
- // Get the current time again and compute the time difference [s]
- t = ((double)getTickCount() - t) / getTickFrequency();
- // Print (in the console window) the processing time in [ms]
- printf("Time = %.3f [ms]\n", t * 1000);
- imshow("input image", src);
- imshow("negative image", dst);
- waitKey(0);
- }
- }
- void testColor2Gray()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname);
- int height = src.rows;
- int width = src.cols;
- Mat dst = Mat(height, width, CV_8UC1);
- // Asa se acceseaaza pixelii individuali pt. o imagine RGB 24 biti/pixel
- // Varianta ineficienta (lenta)
- for (int i = 0; i < height; i++)
- {
- for (int j = 0; j < width; j++)
- {
- Vec3b v3 = src.at<Vec3b>(i, j);
- uchar b = v3[0];
- uchar g = v3[1];
- uchar r = v3[2];
- dst.at<uchar>(i, j) = (r + g + b) / 3;
- }
- }
- imshow("input image", src);
- imshow("gray image", dst);
- waitKey(0);
- }
- }
- void testBGR2HSV()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname);
- int height = src.rows;
- int width = src.cols;
- // Componentele d eculoare ale modelului HSV
- Mat H = Mat(height, width, CV_8UC1);
- Mat S = Mat(height, width, CV_8UC1);
- Mat V = Mat(height, width, CV_8UC1);
- // definire pointeri la matricele (8 biti/pixeli) folosite la afisarea componentelor individuale H,S,V
- uchar* lpH = H.data;
- uchar* lpS = S.data;
- uchar* lpV = V.data;
- Mat hsvImg;
- cvtColor(src, hsvImg, CV_BGR2HSV);
- // definire pointer la matricea (24 biti/pixeli) a imaginii HSV
- uchar* hsvDataPtr = hsvImg.data;
- for (int i = 0; i < height; i++)
- {
- for (int j = 0; j < width; j++)
- {
- int hi = i * width * 3 + j * 3;
- int gi = i * width + j;
- lpH[gi] = hsvDataPtr[hi] * 510 / 360; // lpH = 0 .. 255
- lpS[gi] = hsvDataPtr[hi + 1]; // lpS = 0 .. 255
- lpV[gi] = hsvDataPtr[hi + 2]; // lpV = 0 .. 255
- }
- }
- imshow("input image", src);
- imshow("H", H);
- imshow("S", S);
- imshow("V", V);
- waitKey(0);
- }
- }
- void testResize()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src;
- src = imread(fname);
- Mat dst1, dst2;
- //without interpolation
- resizeImg(src, dst1, 320, false);
- //with interpolation
- resizeImg(src, dst2, 320, true);
- imshow("input image", src);
- imshow("resized image (without interpolation)", dst1);
- imshow("resized image (with interpolation)", dst2);
- waitKey(0);
- }
- }
- void testCanny()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src, dst, gauss;
- src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- double k = 0.4;
- int pH = 50;
- int pL = (int)k*pH;
- GaussianBlur(src, gauss, Size(5, 5), 0.8, 0.8);
- Canny(gauss, dst, pL, pH, 3);
- imshow("input image", src);
- imshow("canny", dst);
- waitKey(0);
- }
- }
- void testVideoSequence()
- {
- VideoCapture cap("Videos/rubic.avi"); // off-line video from file
- //VideoCapture cap(0); // live video from web cam
- if (!cap.isOpened()) {
- printf("Cannot open video capture device.\n");
- waitKey(0);
- return;
- }
- Mat edges;
- Mat frame;
- char c;
- while (cap.read(frame))
- {
- Mat grayFrame;
- cvtColor(frame, grayFrame, CV_BGR2GRAY);
- Canny(grayFrame, edges, 40, 100, 3);
- imshow("source", frame);
- imshow("gray", grayFrame);
- imshow("edges", edges);
- c = cvWaitKey(0); // waits a key press to advance to the next frame
- if (c == 27) {
- // press ESC to exit
- printf("ESC pressed - capture finished\n");
- break; //ESC pressed
- };
- }
- }
- void testSnap()
- {
- VideoCapture cap(0); // open the deafult camera (i.e. the built in web cam)
- if (!cap.isOpened()) // openenig the video device failed
- {
- printf("Cannot open video capture device.\n");
- return;
- }
- Mat frame;
- char numberStr[256];
- char fileName[256];
- // video resolution
- Size capS = Size((int)cap.get(CV_CAP_PROP_FRAME_WIDTH),
- (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT));
- // Display window
- const char* WIN_SRC = "Src"; //window for the source frame
- namedWindow(WIN_SRC, CV_WINDOW_AUTOSIZE);
- cvMoveWindow(WIN_SRC, 0, 0);
- const char* WIN_DST = "Snapped"; //window for showing the snapped frame
- namedWindow(WIN_DST, CV_WINDOW_AUTOSIZE);
- cvMoveWindow(WIN_DST, capS.width + 10, 0);
- char c;
- int frameNum = -1;
- int frameCount = 0;
- for (;;)
- {
- cap >> frame; // get a new frame from camera
- if (frame.empty())
- {
- printf("End of the video file\n");
- break;
- }
- ++frameNum;
- imshow(WIN_SRC, frame);
- c = cvWaitKey(10); // waits a key press to advance to the next frame
- if (c == 27) {
- // press ESC to exit
- printf("ESC pressed - capture finished");
- break; //ESC pressed
- }
- if (c == 115) { //'s' pressed - snapp the image to a file
- frameCount++;
- fileName[0] = NULL;
- sprintf(numberStr, "%d", frameCount);
- strcat(fileName, "Images/A");
- strcat(fileName, numberStr);
- strcat(fileName, ".bmp");
- bool bSuccess = imwrite(fileName, frame);
- if (!bSuccess)
- {
- printf("Error writing the snapped image\n");
- }
- else
- imshow(WIN_DST, frame);
- }
- }
- }
- void MyCallBackFunc(int event, int x, int y, int flags, void* param)
- {
- Mat* src = (Mat*)param;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- printf("Pos(x,y): %d,%d Color(RGB): %d,%d,%d\n",
- x, y,
- (int)(*src).at<Vec3b>(y, x)[2],
- (int)(*src).at<Vec3b>(y, x)[1],
- (int)(*src).at<Vec3b>(y, x)[0]);
- }
- }
- void testMouseClick()
- {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", MyCallBackFunc, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- /* Histogram display function - display a histogram using bars (simlilar to L3 / PI)
- Input:
- name - destination (output) window name
- hist - pointer to the vector containing the histogram values
- hist_cols - no. of bins (elements) in the histogram = histogram image width
- hist_height - height of the histogram image
- Call example:
- showHistogram ("MyHist", hist_dir, 255, 200);
- */
- void showHistogram(const std::string& name, int* hist, const int hist_cols, const int hist_height)
- {
- Mat imgHist(hist_height, hist_cols, CV_8UC3, CV_RGB(255, 255, 255)); // constructs a white image
- //computes histogram maximum
- int max_hist = 0;
- for (int i = 0; i < hist_cols; i++)
- if (hist[i] > max_hist)
- max_hist = hist[i];
- double scale = 1.0;
- scale = (double)hist_height / max_hist;
- int baseline = hist_height - 1;
- for (int x = 0; x < hist_cols; x++) {
- Point p1 = Point(x, baseline);
- Point p2 = Point(x, baseline - cvRound(hist[x] * scale));
- line(imgHist, p1, p2, CV_RGB(255, 0, 255)); // histogram bins colored in magenta
- }
- imshow(name, imgHist);
- }
- void testNegativFrumos()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- double t = (double)getTickCount(); // Get the current time [s]
- Mat src = imread(fname, 1);
- int height = src.rows;
- int width = src.cols;
- Mat dst = Mat(height, width, CV_8UC3);
- // Asa se acceseaaza pixelii individuali pt. o imagine cu 8 biti/pixel
- // Varianta ineficienta (lenta)
- for (int i = 0; i < height; i++)
- {
- for (int j = 0; j < width; j++)
- {
- Vec3b pixel = src.at< Vec3b>(i, j);
- uchar B = pixel[0];
- uchar R = pixel[1];
- uchar G = pixel[2];
- dst.at<Vec3b>(i, j)[0] = 255 - B;
- dst.at<Vec3b>(i, j)[1] = 255 - R;
- dst.at<Vec3b>(i, j)[2] = 255 - G;
- }
- }
- // Get the current time again and compute the time difference [s]
- t = ((double)getTickCount() - t) / getTickFrequency();
- // Print (in the console window) the processing time in [ms]
- printf("Time = %.3f [ms]\n", t * 1000);
- imshow("input image", src);
- imshow("negative image", dst);
- waitKey(0);
- }
- }
- void testGrayScaleAdditiveFactor() {
- char fname[MAX_PATH];
- int factor;
- printf("Factor: ");
- scanf("%d", &factor);
- while (openFileDlg(fname))
- {
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int height = src.rows;
- int width = src.cols;
- Mat dst = Mat(height, width, CV_8UC1);
- for (int i = 0; i < height; i++)
- {
- for (int j = 0; j < width; j++)
- {
- uchar val = src.at<uchar>(i, j);
- int newVal = max(min(val + factor, 255), 0);
- dst.at<uchar>(i, j) = (uchar)newVal;
- }
- }
- imshow("input image", src);
- imshow("Additive factor image", dst);
- waitKey(0);
- }
- }
- void testGrayScaleMultiplyFactor() {
- char fname[MAX_PATH];
- int factor;
- printf("Factor: ");
- scanf("%d", &factor);
- while (openFileDlg(fname))
- {
- //double t = (double)getTickCount(); // Get the current time [s]
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int height = src.rows;
- int width = src.cols;
- Mat dst = Mat(height, width, CV_8UC1);
- for (int i = 0; i < height; i++)
- {
- for (int j = 0; j < width; j++)
- {
- uchar val = src.at<uchar>(i, j);
- int newVal = max(min(val * factor, 255), 0);
- dst.at<uchar>(i, j) = (uchar)newVal;
- }
- }
- //t = ((double)getTickCount() - t) / getTickFrequency();
- imshow("input image", src);
- imshow("Multiply factor image", dst);
- imwrite("D:\\30236\\Teo\\OpenCVApplication-VS2013_OCV2413_basic\\Images\\imaginea_noastra.bmp", dst); //writes the destination to file
- waitKey(0);
- }
- }
- void Patrate_colorate() {
- int rows = 256;
- int cols = 256;
- int half_row = rows / 2;
- int half_col = cols / 2;
- Mat src(rows, cols, CV_8UC3);
- for (int i = 0; i < rows; i++) {
- for (int j = 0; j < cols; j++) {
- if (i <= half_row) {
- if (j <= half_col) {
- //ALB
- src.at<Vec3b>(i, j)[0] = 255;
- src.at<Vec3b>(i, j)[1] = 255;
- src.at<Vec3b>(i, j)[2] = 255;
- }
- else {
- //ROSU
- src.at<Vec3b>(i, j)[0] = 0;
- src.at<Vec3b>(i, j)[1] = 0;
- src.at<Vec3b>(i, j)[2] = 255;
- }
- }
- else {
- if (j <= half_col) {
- //VERDE
- src.at<Vec3b>(i, j)[0] = 0;
- src.at<Vec3b>(i, j)[1] = 255;
- src.at<Vec3b>(i, j)[2] = 0;
- }
- else {
- //GALBEN
- src.at<Vec3b>(i, j)[0] = 0;
- src.at<Vec3b>(i, j)[1] = 255;
- src.at<Vec3b>(i, j)[2] = 255;
- }
- }
- }
- }
- imshow("Patrate colorate", src);
- imwrite("D:\\30236\\Teo\\OpenCVApplication-VS2013_OCV2413_basic\\Images\\patrateleeeeeeeeeeee.bmp", src); //writes the destination to file
- waitKey(0);
- }
- void matricica_inv() {
- float vals[9];
- for (int i = 0; i < 9; i++) {
- scanf("%f", &vals[i]);
- }
- Mat M(3, 3, CV_32FC1, vals); //stocare date de tip float
- Mat inv = M.inv();
- std::cout << inv << std::endl;
- }
- void split_windows() {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_COLOR);
- imshow("original image", img);
- Mat imR(img.rows, img.cols, CV_8UC1), imG(img.rows, img.cols, CV_8UC1), imB(img.rows, img.cols, CV_8UC1);
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- imR.at<uchar>(i, j) = img.at<Vec3b>(i, j)[2];
- imG.at<uchar>(i, j) = img.at<Vec3b>(i, j)[1];
- imB.at<uchar>(i, j) = img.at<Vec3b>(i, j)[0];
- }
- }
- imshow("R", imR);
- imshow("G", imG);
- imshow("B", imB);
- waitKey(0);
- }
- }
- void color_to_grayscale() {
- char fname[10000];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_COLOR);
- imshow("original image", img);
- Mat imgr(img.rows, img.cols, CV_8UC1);
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- imgr.at<uchar>(i, j) = (img.at<Vec3b>(i, j)[2] + img.at<Vec3b>(i, j)[1] + img.at<Vec3b>(i, j)[0]) / 3;
- }
- }
- imshow("grayscale", imgr);
- waitKey(0);
- }
- }
- void grayscale_to_black_white() {
- char fname[10000];
- int prag;
- printf("Prag: ");
- scanf("%d", &prag);
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("original image", img);
- Mat imgr(img.rows, img.cols, CV_8UC1);
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- if (img.at<uchar>(i, j) > prag) {
- imgr.at<uchar>(i, j) = 255;
- }
- else {
- imgr.at<uchar>(i, j) = 0;
- }
- }
- }
- imshow("black and white", imgr);
- waitKey(0);
- }
- }
- void rgb_to_hsv() {
- char fname[10000];
- float r, g, b, M, m, C, H, S, V;
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_COLOR);
- imshow("original image", img);
- Mat imH(img.rows, img.cols, CV_8UC1), imS(img.rows, img.cols, CV_8UC1), imV(img.rows, img.cols, CV_8UC1);
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- r = (float)img.at<Vec3b>(i, j)[2] / 255;
- g = (float)img.at<Vec3b>(i, j)[1] / 255;
- b = (float)img.at<Vec3b>(i, j)[0] / 255;
- M = max(max(r, g), b);
- m = min(min(r, g), b);
- C = M - m;
- V = M;
- if (V != 0)
- S = C / V;
- else
- S = 0;
- if (C != 0) {
- if (M == r) {
- H = 60 * (g - b) / C;
- }
- if (M == g) {
- H = 120 * (b - r) / C;
- }
- if (M == b) {
- H = 240 * (r - g) / C;
- }
- }
- else {
- H = 0;
- }
- if (H < 0) {
- H = H + 360;
- }
- imH.at<uchar>(i, j) = H * 255 / 360;
- imS.at<uchar>(i, j) = S * 255;
- imV.at<uchar>(i, j) = V * 255;
- }
- }
- imshow("H", imH);
- imshow("S", imS);
- imshow("V", imV);
- waitKey(0);
- }
- }
- bool isInside(Mat src, int i, int j) {
- int height = src.rows;
- int width = src.cols;
- if ((i > width) || (i < 0)) {
- return false;
- }
- if ((j > height) || (j < 0)) {
- return false;
- }
- return true;
- }
- void testIsInside() {
- int i, j;
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src = imread(fname, CV_LOAD_IMAGE_COLOR);
- printf("i: ");
- scanf("%d", &i);
- printf("j: ");
- scanf("%d", &j);
- if (isInside(src, i, j))
- printf("Is inside\n");
- else printf("Is outside\n");
- }
- }
- void histogram() {
- char fname[10000];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("original image", img);
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- histValues[img.at<uchar>(i, j)]++;
- }
- }
- showHistogram("MyHist", histValues, 256, 500);
- for (int i = 0; i < 256; i++)
- {
- histValues[i] = 0;
- }
- }
- }
- void normalizeHistogram(int* histogram, int size) {
- for (int i = 0; i < 256; i++)
- normalizedHistoValues[i] = (float)histValues[i] / size;
- }
- void histo(Mat img, int m, int* &hist) {
- hist = new int[m] {};
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- int bin = (float)img.at<uchar>(i, j) / 256 * m;
- hist[bin]++;
- }
- }
- void praguri_multiple() {
- int WH = 5;
- float TH = 0.0003;
- float v;
- int dimension = 1;
- boolean ok;
- char fname[10000];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("original image", img);
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- histValues[img.at<uchar>(i, j)]++;
- }
- }
- normalizeHistogram(histValues, img.rows*img.cols);
- for (int k = 0 + WH; k < 255 - WH; k++) {
- v = 0;
- ok = true;
- for (int i = k - WH; i < k + WH; i++) {
- v += normalizedHistoValues[i];
- if (normalizedHistoValues[k] < normalizedHistoValues[i]) {
- ok = false;
- }
- }
- v = v / (2 * WH + 1);
- if (normalizedHistoValues[k] > v + TH && ok) {
- result[dimension++] = k;
- }
- }
- result[0] = 0;
- result[dimension] = 255;
- dimension++;
- for (int i = 0; i < dimension; i++) {
- std::cout << result[i] << "\n" << std::endl;
- }
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- int maxx = -1;
- for (int k = 0; k < dimension - 1; k++) {
- if (img.at<uchar>(i, j) > result[k] && img.at<uchar>(i, j) < result[k + 1]) {
- if (img.at<uchar>(i, j) - result[k] < result[k + 1] - img.at<uchar>(i, j)) {
- img.at<uchar>(i, j) = result[k];
- }
- else {
- img.at<uchar>(i, j) = result[k + 1];
- }
- }
- }
- }
- }
- imshow("praguri_multiple", img);
- }
- }
- uchar limit_value(int value) {
- if (value < 0) {
- return 0;
- }
- else if (value > 255) {
- return 255;
- }
- else {
- return value;
- }
- }
- void floyd_steinberg() {
- int WH = 5;
- float TH = 0.0003;
- float miu;
- int dimension = 1;
- boolean ok;
- char fname[10000];
- while (openFileDlg(fname))
- {
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("original image", img);
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- histValues[img.at<uchar>(i, j)]++;
- }
- }
- normalizeHistogram(histValues, img.rows*img.cols);
- for (int k = 0 + WH; k < 255 - WH; k++) {
- miu = 0;
- ok = true;
- for (int i = k - WH; i < k + WH; i++) {
- miu += normalizedHistoValues[i];
- if (normalizedHistoValues[k] < normalizedHistoValues[i])ok = false;
- }
- miu = miu / (2 * WH + 1);
- if (normalizedHistoValues[k] > miu + TH && ok) {
- result[dimension++] = k;
- }
- }
- result[0] = 0;
- result[dimension] = 255;
- dimension++;
- for (int i = 0; i < dimension; i++) {
- std::cout << result[i] << "\n" << std::endl;
- }
- for (int i = 0; i < img.rows - 1; i++)
- {
- for (int j = 0; j < img.cols - 1; j++)
- {
- int oldValue = img.at<uchar>(i, j);
- int newValue;
- float error;
- for (int k = 0; k < dimension - 1; k++) {
- if (img.at<uchar>(i, j) > result[k] && img.at<uchar>(i, j) < result[k + 1]) {
- if (img.at<uchar>(i, j) - result[k] < result[k + 1] - img.at<uchar>(i, j))newValue = result[k];
- else newValue = result[k + 1];
- }
- }
- error = oldValue - newValue;
- img.at<uchar>(i, j) = newValue;
- img.at<uchar>(i, j + 1) = img.at<uchar>(i, j + 1) + limit_value((int)(7 * error / 16));
- img.at<uchar>(i + 1, j - 1) = img.at<uchar>(i + 1, j - 1) + limit_value((int)(3 * error / 16));
- img.at<uchar>(i + 1, j) = img.at<uchar>(i + 1, j) + limit_value((int)(5 * error / 16));
- img.at<uchar>(i + 1, j + 1) = img.at<uchar>(i + 1, j + 1) + limit_value((int)(error / 16));
- }
- }
- imshow("floyd image", img);
- }
- }
- void onMouse(int event, int x, int y, int flags, void* param)
- {
- if (event == EVENT_MOUSEMOVE)
- {
- printf("Mouse move over the window - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_LBUTTONDOWN)
- {
- printf("Left button of the mouse is clicked - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_RBUTTONDOWN)
- {
- printf("Right button of the mouse is clicked - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_MBUTTONDOWN)
- {
- printf("Middle button of the mouse is clicked - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_LBUTTONUP)
- {
- printf("Left button of the mouse is released - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_RBUTTONUP)
- {
- printf("Right button of the mouse is released - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_MBUTTONUP)
- {
- printf("Middle button of the mouse is released - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_LBUTTONDBLCLK)
- {
- printf("Middle button of the mouse is double click - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_RBUTTONDBLCLK)
- {
- printf("Middle button of the mouse is double click - position (", x, ", ", y, ")");
- }
- else if (event == EVENT_MBUTTONDBLCLK)
- {
- printf("Middle button of the mouse is double click - position (", x, ", ", y, ")");
- }
- }
- void calcAria(int event, int x, int y, int flags, void* param)
- {
- Mat* src = (Mat*)param;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- int b = (int)(*src).at<Vec3b>(y, x)[0];
- int g = (int)(*src).at<Vec3b>(y, x)[1];
- int r = (int)(*src).at<Vec3b>(y, x)[2];
- int aria = 0;
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if ((int)(*src).at<Vec3b>(i, j)[0] == b && (int)(*src).at<Vec3b>(i, j)[1] == g && (int)(*src).at<Vec3b>(y, x)[2] == r) {
- aria++;
- }
- }
- }
- printf("%d\n", aria);
- }
- }
- void computeAria() {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", calcAria, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- void calcCentruDeMasa(int event, int x, int y, int flags, void* param)
- {
- Mat* src = (Mat*)param;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- int b = (int)(*src).at<Vec3b>(y, x)[0];
- int g = (int)(*src).at<Vec3b>(y, x)[1];
- int r = (int)(*src).at<Vec3b>(y, x)[2];
- int aria = 0;
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if ((int)(*src).at<Vec3b>(i, j)[0] == b && (int)(*src).at<Vec3b>(i, j)[1] == g && (int)(*src).at<Vec3b>(y, x)[2] == r) {
- aria++;
- }
- }
- }
- int col = 0, row = 0;
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if ((int)(*src).at<Vec3b>(i, j)[0] == b && (int)(*src).at<Vec3b>(i, j)[1] == g && (int)(*src).at<Vec3b>(y, x)[2] == r) {
- row += i;
- col += j;
- }
- }
- }
- printf("r = %f , c = %f\n", ((float)1 / aria)*row, ((float)1 / aria)*col);
- }
- }
- void computeCentrulDeMasa() {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", calcCentruDeMasa, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- void ElongationCallBack(int event, int x, int y, int flags, void* param)
- {
- Mat* src = (Mat*)param;
- Mat src1 = *src;
- Vec3b label = 0;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- label = src1.at<Vec3b>(y, x);
- int area = 0;
- int aux_rows = 0;
- int aux_cols = 0;
- for (int i = 0; i < src1.rows; i++) {
- for (int j = 0; j < src1.cols; j++) {
- if (src1.at<Vec3b>(i, j) == label) {
- area++;
- aux_rows += i;
- aux_cols += j;
- }
- }
- }
- int massX = aux_rows / area;
- int massY = aux_cols / area;
- float tan = 0.0;
- int sum_cols = 0;
- int sum_rows = 0;
- for (int i = 0; i < src1.rows; i++) {
- for (int j = 0; j < src1.cols; j++) {
- if (src1.at<Vec3b>(i, j) == label) {
- tan += (i - massX)*(j - massY);
- sum_cols += (j - massY) ^ 2;
- sum_rows += (i - massX) ^ 2;
- }
- }
- }
- float alfa = atan2(2 * tan, (sum_cols - sum_rows));
- float angle = (alfa * 90) / PI;
- printf("Angle is is %f\n", angle);
- }
- }
- void computeElongation()
- {
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- Mat src;
- src = imread(fname, CV_LOAD_IMAGE_COLOR);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", ElongationCallBack, &src);
- //show the image
- imshow("My Window", src);
- waitKey();
- }
- }
- void computePerimeterCallback(int event, int x, int y, int flags, void* param) {
- Mat* src = (Mat*)param;
- Mat src1 = *src;
- Vec3b label = 0;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- label = src1.at<Vec3b>(y, x);
- int perimeter = 0;
- for (int i = 0; i < src1.rows; i++) {
- for (int j = 0; j < src1.cols; j++) {
- if (src1.at<Vec3b>(i, j) == label)
- if (src1.at<Vec3b>(i - 1, j) != label | src1.at<Vec3b>(i - 1, j - 1) != label | src1.at<Vec3b>(i - 1, j + 1) != label | src1.at<Vec3b>(i, j + 1) != label
- | src1.at<Vec3b>(i + 1, j - 1) != label | src1.at<Vec3b>(i + 1, j) != label | src1.at<Vec3b>(i + 1, j + 1) != label | src1.at<Vec3b>(i, j - 1) != label)
- {
- perimeter++;
- }
- }
- }
- printf("Perimeter is %d\n", perimeter);
- }
- }
- void computePerimeter() {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", computePerimeterCallback, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- void computeFactorDesubtiereCallback(int event, int x, int y, int flags, void* param) {
- Mat* src = (Mat*)param;
- Mat src1 = *src;
- Vec3b label = 0;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- label = src1.at<Vec3b>(y, x);
- int aria = 0;
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if (label == src1.at<Vec3b>(i, j)) {
- aria++;
- }
- }
- }
- int perimeter = 0;
- for (int i = 0; i < src1.rows; i++) {
- for (int j = 0; j < src1.cols; j++) {
- if (src1.at<Vec3b>(i, j) == label)
- if (src1.at<Vec3b>(i - 1, j) != label | src1.at<Vec3b>(i - 1, j - 1) != label | src1.at<Vec3b>(i - 1, j + 1) != label | src1.at<Vec3b>(i, j + 1) != label
- | src1.at<Vec3b>(i + 1, j - 1) != label | src1.at<Vec3b>(i + 1, j) != label | src1.at<Vec3b>(i + 1, j + 1) != label | src1.at<Vec3b>(i, j - 1) != label)
- {
- perimeter++;
- }
- }
- }
- printf("Factorul de subtiere este %f\n", 4 * PI*((float)aria / (perimeter*perimeter)));
- }
- }
- void computeFactorDeSubtiere() {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", computeFactorDesubtiereCallback, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- void computeFactorDeAspectCallback(int event, int x, int y, int flags, void* param)
- {
- Mat* src = (Mat*)param;
- Mat src1 = *src;
- Vec3b label = 0;
- int cMax = -255;
- int cMin = 255;
- int rMax = -255;
- int rMin = 255;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- int b = (int)(*src).at<Vec3b>(y, x)[0];
- int g = (int)(*src).at<Vec3b>(y, x)[1];
- int r = (int)(*src).at<Vec3b>(y, x)[2];
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if ((int)(*src).at<Vec3b>(i, j)[0] == b && (int)(*src).at<Vec3b>(i, j)[1] == g && (int)(*src).at<Vec3b>(y, x)[2] == r) {
- if (i < cMin)
- {
- rMin = i;
- }
- if (i > cMax)
- {
- rMax = i;
- }
- if (j < cMin)
- {
- cMin = j;
- }
- if (j > cMax)
- {
- cMax = j;
- }
- }
- }
- }
- float x = cMax - cMin + 1;
- float y = rMax - rMin + 1;
- printf("%f", x / y);
- }
- }
- void computeFactorulDeAspect() {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", computeFactorDeAspectCallback, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- void drawContour() {
- Mat src1;
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src1 = imread(fname);
- Vec3b label = src1.at<Vec3b>(0, 0);
- Mat src(src1.rows, src1.cols, CV_8UC3);
- for (int i = 0; i < src1.rows; i++)
- for (int j = 0; j < src1.cols; j++) {
- src.at<Vec3b>(i, j) = label;
- if (src1.at<Vec3b>(i, j) != label) {
- if (src1.at<Vec3b>(i - 1, j) == label | src1.at<Vec3b>(i - 1, j - 1) == label | src1.at<Vec3b>(i - 1, j + 1) == label | src1.at<Vec3b>(i, j + 1) == label
- | src1.at<Vec3b>(i + 1, j - 1) == label | src1.at<Vec3b>(i + 1, j) == label | src1.at<Vec3b>(i + 1, j + 1) == label | src1.at<Vec3b>(i, j - 1) == label)
- {
- src.at<Vec3b>(i, j) = src1.at<Vec3b>(i, j);
- }
- }
- }
- imshow("nume", src);
- waitKey(0);
- }
- }
- void thAria() {
- Mat src1;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- int th;
- printf("th= ");
- scanf("%d", &th);
- src1 = imread(fname);
- Vec3b label = src1.at<Vec3b>(0, 0);
- Mat src(src1.rows, src1.cols, CV_8UC3);
- int aria[255 + 1000 * 3];
- for (int i = 0; i < 1000; i++)
- aria[i] = 0;
- for (int i = 0; i < (src1).rows; i++) {
- for (int j = 0; j < src1.cols; j++) {
- aria[src1.at<Vec3b>(i, j)[0] + src1.at<Vec3b>(i, j)[1] + src1.at<Vec3b>(i, j)[2]]++;
- }
- }
- for (int i = 0; i < (src1).rows; i++) {
- for (int j = 0; j < src1.cols; j++) {
- if (aria[src1.at<Vec3b>(i, j)[0] + src1.at<Vec3b>(i, j)[1] + src1.at<Vec3b>(i, j)[2]] < th) {
- src.at<Vec3b>(i, j) = src1.at<Vec3b>(i, j);
- }
- }
- }
- imshow("nume", src);
- waitKey(0);
- }
- }
- void imagineSeparata(int event, int x, int y, int flags, void* param) {
- Mat* src = (Mat*)param;
- Vec3b selectedPixel = (Vec3b)(*src).at<Vec3b>(y, x);
- Mat src1 = *src;
- Vec3b label = 0;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- int rN, cN;
- label = src1.at<Vec3b>(y, x);
- int area = 0;
- int aux_rows = 0;
- int aux_cols = 0;
- for (int i = 0; i < src1.rows; i++) {
- for (int j = 0; j < src1.cols; j++) {
- if (src1.at<Vec3b>(i, j) == label) {
- area++;
- aux_rows += i;
- aux_cols += j;
- }
- }
- }
- int massX = aux_rows / area;
- int massY = aux_cols / area;
- float tan = 0.0;
- int sum_cols = 0;
- int sum_rows = 0;
- for (int i = 0; i < src1.rows; i++) {
- for (int j = 0; j < src1.cols; j++) {
- if (src1.at<Vec3b>(i, j) == label) {
- tan += (i - massX)*(j - massY);
- sum_cols += (j - massY) ^ 2;
- sum_rows += (i - massX) ^ 2;
- }
- }
- }
- float alfa = atan2(2 * tan, (sum_cols - sum_rows));
- float angle = (alfa * 90) / PI;
- int b = (int)(*src).at<Vec3b>(y, x)[0];
- int g = (int)(*src).at<Vec3b>(y, x)[1];
- int r = (int)(*src).at<Vec3b>(y, x)[2];
- int aria = 0;
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if ((int)(*src).at<Vec3b>(i, j)[0] == b && (int)(*src).at<Vec3b>(i, j)[1] == g && (int)(*src).at<Vec3b>(y, x)[2] == r) {
- aria++;
- }
- }
- }
- int col = 0, row = 0;
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if ((int)(*src).at<Vec3b>(i, j)[0] == b && (int)(*src).at<Vec3b>(i, j)[1] == g && (int)(*src).at<Vec3b>(y, x)[2] == r) {
- row += i;
- col += j;
- }
- }
- }
- rN = ((float)1 / aria)*row;
- cN = ((float)1 / aria)*col;
- if (selectedPixel == Vec3b(255, 255, 255)) {
- return;
- }
- Mat img((*src).rows, (*src).cols, CV_8UC3, Scalar(255, 255, 255));
- Vec3b pixelNegru = Vec3b(0, 0, 0);
- for (int i = 1; i < src->rows - 1; i++) {
- for (int j = 1; j < src->cols - 1; j++) {
- if (selectedPixel == (Vec3b)(*src).at<Vec3b>(i, j)) {
- if (selectedPixel != (Vec3b)(*src).at<Vec3b>(i, j - 1) ||
- selectedPixel != (Vec3b)(*src).at<Vec3b>(i, j + 1) ||
- selectedPixel != (Vec3b)(*src).at<Vec3b>(i - 1, j - 1) ||
- selectedPixel != (Vec3b)(*src).at<Vec3b>(i - 1, j + 1) ||
- selectedPixel != (Vec3b)(*src).at<Vec3b>(i - 1, j) ||
- selectedPixel != (Vec3b)(*src).at<Vec3b>(i + 1, j - 1) ||
- selectedPixel != (Vec3b)(*src).at<Vec3b>(i + 1, j + 1) ||
- selectedPixel != (Vec3b)(*src).at<Vec3b>(i + 1, j))
- {
- img.at<Vec3b>(i, j) = pixelNegru;
- }
- }
- if (i == rN && j == cN) {
- img.at<Vec3b>(i, j) = pixelNegru;
- img.at<Vec3b>(i, j - 1) = pixelNegru;
- img.at<Vec3b>(i, j + 1) = pixelNegru;
- img.at<Vec3b>(i - 1, j) = pixelNegru;
- img.at<Vec3b>(i - 1, j - 1) = pixelNegru;
- img.at<Vec3b>(i - 1, j + 1) = pixelNegru;
- img.at<Vec3b>(i + 1, j) = pixelNegru;
- img.at<Vec3b>(i + 1, j - 1) = pixelNegru;
- img.at<Vec3b>(i + 1, j + 1) = pixelNegru;
- }
- }
- }
- Point startPoint(cN, rN);
- Point endPoint(cN + 100 * cos(angle * 180 / CV_PI), rN + 100 * sin(angle * 180 / CV_PI));
- line(img, startPoint, endPoint, Scalar(0, 0, 0), 1);
- imshow("Desen", img);
- // punctul c
- int cmax = -1;
- int cmin = 100000;
- int rmax = -1;
- int rmin = 100000;
- for (int i = 1; i < src->rows - 1; i++) {
- for (int j = 1; j < src->cols - 1; j++) {
- if (selectedPixel == (Vec3b)(*src).at<Vec3b>(i, j)) {
- if (cmax < j) cmax = j;
- if (cmin > j) cmin = j;
- if (rmax < i) rmax = i;
- if (rmin > i) rmin = i;
- }
- }
- }
- int inaltimeP = rmax - rmin;
- int latimeP = cmax - cmin;
- int himg = 2 * inaltimeP + 300;
- int wimg = 2 * latimeP + 300;
- Mat proiectie(himg, wimg, CV_8UC1);
- for (int i = 0; i < src->rows; i++) {
- for (int j = 0; j < src->cols; j++) {
- if (selectedPixel == (Vec3b)(*src).at<Vec3b>(i, j)) {
- proiectie.at<uchar>(himg - (i - rmin + inaltimeP + 200), j - cmin + latimeP + 200) = 0;
- }
- }
- }
- for (int i = 50; i < himg - 50; i++) {
- proiectie.at<uchar>(i, 50) = 0;
- }
- for (int i = 50; i < wimg - 50; i++) {
- proiectie.at<uchar>(himg - 50, i) = 0;
- }
- //imshow("Proiectie", proiectie);
- }
- }
- void computeImagineSeparata() {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", imagineSeparata, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- void computeHorizontalProjection(int event, int x, int y, int flags, void* param)
- {
- Mat* src = (Mat*)param;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- int b = (int)(*src).at<Vec3b>(y, x)[0];
- int g = (int)(*src).at<Vec3b>(y, x)[1];
- int r = (int)(*src).at<Vec3b>(y, x)[2];
- int * h = (int *)malloc((*src).rows * sizeof(int));
- int value = 0;
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if ((int)(*src).at<Vec3b>(i, j)[0] == b && (int)(*src).at<Vec3b>(i, j)[1] == g && (int)(*src).at<Vec3b>(y, x)[2] == r) {
- value++;
- }
- }
- h[i] = value;
- }
- printf("%d\n", h);
- }
- }
- void computeHorizontalProjectionCallback() {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", computeHorizontalProjection, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- void computeVerticalProjection(int event, int x, int y, int flags, void* param)
- {
- Mat* src = (Mat*)param;
- if (event == CV_EVENT_LBUTTONDOWN)
- {
- int b = (int)(*src).at<Vec3b>(y, x)[0];
- int g = (int)(*src).at<Vec3b>(y, x)[1];
- int r = (int)(*src).at<Vec3b>(y, x)[2];
- int * h = (int *)malloc((*src).cols * sizeof(int));
- int value = 0;
- for (int i = 0; i < (*src).rows; i++) {
- for (int j = 0; j < (*src).cols; j++) {
- if ((int)(*src).at<Vec3b>(i, j)[0] == b && (int)(*src).at<Vec3b>(i, j)[1] == g && (int)(*src).at<Vec3b>(y, x)[2] == r) {
- value++;
- }
- }
- h[i] = value;
- }
- printf("%d\n", h);
- }
- }
- void computeVerticalProjectionCallback() {
- Mat src;
- // Read image from file
- char fname[MAX_PATH];
- while (openFileDlg(fname))
- {
- src = imread(fname);
- //Create a window
- namedWindow("My Window", 1);
- //set the callback function for any mouse event
- setMouseCallback("My Window", computeHorizontalProjection, &src);
- //show the image
- imshow("My Window", src);
- // Wait until user press some key
- waitKey(0);
- }
- }
- void Bfs() {
- char fname[MAX_PATH];
- Mat src;
- while (openFileDlg(fname)) {
- src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- waitKey();
- int label = 0;
- Mat labels = Mat::zeros(src.rows, src.cols, CV_32SC1);
- Mat destinatie = Mat::zeros(src.rows, src.cols, CV_8UC3);
- int di[8] = { -1, 0, 1, 0, 1, -1, 1, -1 };
- int dj[8] = { 0, -1, 0, 1, 1, 1, -1, -1 };
- int ni = 0;
- int nj = 0;
- for (int i = 0; i < src.rows; i++) {
- for (int j = 0; j < src.cols; j++) {
- if (src.at<uchar>(i, j) == 0 && labels.at<int>(i, j) == 0) {
- label++;
- std::queue<Point2i> Q;
- labels.at<int>(i, j) = label;
- Q.push({ i, j });
- while (!Q.empty()) {
- Point2i p = Q.front();
- Q.pop();
- for (int k = 0; k < 8; k++) {
- ni = p.x + di[k];
- nj = p.y + dj[k];
- if (!(ni < 0 || ni >= src.rows || nj < 0 || nj >= src.cols)
- && labels.at<int>(ni, nj) == 0 && src.at<uchar>(ni, nj) == 0) {
- labels.at<int>(ni, nj) = label;
- Q.push({ ni, nj });
- }
- }
- }
- }
- }
- }
- std::vector<Vec3b> culori = std::vector<Vec3b>(label);
- std::default_random_engine gen;
- std::uniform_int_distribution<int> d(0, 255);
- for (int i = 0; i < label; i++) {
- uchar r = d(gen);
- uchar g = d(gen);
- uchar b = d(gen);
- culori.at(i) = Vec3b(r, g, b);
- }
- for (int i = 0; i < src.rows; i++) {
- for (int j = 0; j < src.cols; j++) {
- if (labels.at<int>(i, j) > 0) {
- destinatie.at<Vec3b>(i, j) = culori.at(labels.at<int>(i, j) - 1);
- }
- else {
- destinatie.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
- }
- }
- }
- imshow("imagine", destinatie);
- waitKey(0);
- }
- }
- void douaTreceri() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat src = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- waitKey();
- Mat labels = Mat::zeros(src.rows, src.cols, CV_32SC1);
- Mat dstP = Mat::zeros(src.rows, src.cols, CV_8UC3);
- Mat dstF = Mat::zeros(src.rows, src.cols, CV_8UC3);
- int di[8] = { -1, 0, 1, 0, 1, -1, 1, -1 };
- int dj[8] = { 0, -1, 0, 1, 1, 1, -1, -1 };
- int label = 1;
- for (int i = 0; i < src.rows; i++) {
- for (int j = 0; j < src.cols; j++) {
- if (src.at<uchar>(i, j) != 255) {
- labels.at<int>(i, j) = label;
- label++;
- }
- else
- labels.at<int>(i, j) = 0;
- }
- }
- for (int i = 0; i < src.rows; i++) {
- for (int j = 0; j < src.cols; j++) {
- if (labels.at<int>(i, j) != 0) {
- int smallest = labels.at<int>(i, j);
- for (int k = 0; k < 8; k++) {
- if (smallest > labels.at<int>(i + di[k], j + dj[k]) && labels.at<int>(i + di[k], j + dj[k]) != 0) {
- smallest = labels.at<int>(i + di[k], j + dj[k]);
- }
- }
- labels.at<int>(i, j) = smallest;
- }
- }
- }
- std::vector<Vec3b> culori = std::vector<Vec3b>(label);
- std::default_random_engine gen;
- std::uniform_int_distribution<int> d(0, 255);
- for (int i = 0; i < label; i++) {
- uchar r = d(gen);
- uchar g = d(gen);
- uchar b = d(gen);
- culori.at(i) = Vec3b(r, g, b);
- }
- for (int i = 0; i < src.rows; i++) {
- for (int j = 0; j < src.cols; j++) {
- if (labels.at<int>(i, j) > 0) {
- dstP.at<Vec3b>(i, j) = culori.at(labels.at<int>(i, j) - 1);
- }
- else {
- dstP.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
- }
- }
- }
- for (int i = src.rows - 1; i >= 0; i--) {
- for (int j = src.cols - 1; j >= 0; j--) {
- if (labels.at<int>(i, j) != 0) {
- int smallest = labels.at<int>(i, j);
- for (int k = 0; k < 8; k++) {
- if (smallest > labels.at<int>(i + di[k], j + dj[k]) && labels.at<int>(i + di[k], j + dj[k]) != 0) {
- smallest = labels.at<int>(i + di[k], j + dj[k]);
- }
- }
- labels.at<int>(i, j) = smallest;
- }
- }
- }
- for (int i = 0; i < label; i++) {
- uchar r = d(gen);
- uchar g = d(gen);
- uchar b = d(gen);
- culori.at(i) = Vec3b(r, g, b);
- }
- for (int i = 0; i < src.rows; i++) {
- for (int j = 0; j < src.cols; j++) {
- if (labels.at<int>(i, j) > 0) {
- dstF.at<Vec3b>(i, j) = culori.at(labels.at<int>(i, j) - 1);
- }
- else {
- dstF.at<Vec3b>(i, j) = Vec3b(255, 255, 255);
- }
- }
- }
- imshow("Partial", dstP);
- imshow("Final", dstF);
- waitKey(0);
- }
- void contur(Mat img) {
- int difX[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
- int difY[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
- int dir = 7;
- vector<pair<int, int>> P;
- vector<int> dirs;
- for (int i = 0; i < img.rows; i++) {
- for (int j = 0; j < img.cols; j++) {
- if (img.at<uchar>(i, j) == 0) {
- P.push_back(make_pair(i, j));
- goto exit_label;
- }
- }
- }
- exit_label:
- while (1) {
- dir % 2 == 0 ? dir = (dir + 7) % 8 : dir = (dir + 6) % 8;
- for (int i = 0; i < 8; i++) {
- int ndir = (dir + i) % 8;
- int nx = difX[ndir] + P[P.size() - 1].first;
- int ny = difY[ndir] + P[P.size() - 1].second;
- if (nx >= 0 && ny >= 0 && nx <= img.rows && ny <= img.cols) {
- if (img.at<uchar>(nx, ny) == 0) {
- dir = ndir;
- P.push_back(make_pair(nx, ny));
- dirs.push_back(ndir);
- break;
- }
- }
- }
- if (P[P.size() - 1] == P[0]) {
- break;
- }
- }
- Mat newImg(img.rows, img.cols, CV_8UC1, Scalar(255));
- for (auto& it : P) {
- newImg.at<uchar>(it.first, it.second) = 0;
- }
- for (auto& it : dirs) {
- cout << it << " ";
- }
- vector<int> derivata;
- cout << "\n\n\n";
- for (int i = 1; i < dirs.size(); i++) {
- derivata.push_back(((dirs[i - 1] - dirs[i]) % 8 + 8) % 8);
- cout << derivata[i - 1]<<" ";
- }
- imshow("contur", newImg);
- waitKey(0);
- }
- void reconstruct() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int difX[8] = { 0, -1, -1, -1, 0, 1, 1, 1 };
- int difY[8] = { 1, 1, 0, -1, -1, -1, 0, 1 };
- ifstream f("reconstruct.txt");
- int x, y, n;
- f >> x >> y >> n;
- img.at<uchar>(x, y) = 0;
- int dir;
- for (int i = 0; i < n; i++) {
- f >> dir;
- int nx = x + difX[dir];
- int ny = y + difY[dir];
- if (nx >= 0 && ny >= 0 && nx < img.rows && ny < img.cols) {
- img.at<uchar>(nx, ny) = 0;
- }
- x = nx;
- y = ny;
- }
- imshow("rec", img);
- waitKey(0);
- }
- Mat dilatare(Mat img, int n) {
- Mat aux = img.clone();
- int di[4] = { 0, -1, 0, 1 };
- int dj[4] = { 1, 0, -1, 0 };
- for (int i = 1; i < img.rows - 1; i++)
- for (int j = 1; j < img.cols - 1; j++)
- if (img.at<uchar>(i, j) == 0)
- {
- for (int k = 0; k < 4; k++)
- aux.at<uchar>(i + di[k], j + dj[k]) = 0;
- }
- if (n == 1)
- return aux;
- else
- return dilatare(aux, n - 1);
- }
- Mat erodare(Mat img, int n) {
- Mat aux = Mat(img.rows, img.cols, CV_8UC1, Scalar(255));
- int di[4] = { 0, -1, 0, 1 };
- int dj[4] = { 1, 0, -1, 0 };
- for (int i = 1; i < img.rows - 1; i++)
- for (int j = 1; j < img.cols - 1; j++)
- if (img.at<uchar>(i, j) == 0)
- {
- bool ok = true;
- for (int k = 0; k < 4; k++)
- if (img.at<uchar>(i + di[k], j + dj[k]) != 0)
- {
- ok = false;
- break;
- }
- if (ok)
- aux.at<uchar>(i, j) = 0;
- }
- if (n == 1)
- return aux;
- else
- return erodare(aux, n - 1);
- }
- Mat deschidere(Mat img) {
- Mat aux = erodare(img, 1);
- return dilatare(aux, 1);
- }
- Mat inchidere(Mat img) {
- Mat aux = dilatare(img, 1);
- return erodare(aux, 1);
- }
- void conturMorfologic() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("Imagine initiala", img);
- Mat aux = erodare(img, 1);
- Mat rez = Mat(img.rows, img.cols, CV_8UC1, Scalar(255));
- for (int i = 1; i < img.rows - 1; i++)
- for (int j = 1; j < img.cols - 1; j++)
- if (img.at<uchar>(i, j) == 0 && aux.at<uchar>(i, j) != 0)
- rez.at<uchar>(i, j) = 0;
- imshow("Contur", rez);
- waitKey(0);
- }
- void umplere() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- Mat rez = Mat(img.rows, img.cols, CV_8UC1, Scalar(255));
- rez.at<uchar>(img.rows / 2, img.cols / 2) = 0;
- Mat aux; bool ready;
- int di[4] = { 0, -1, 0, 1 };
- int dj[4] = { 1, 0, -1, 0 };
- do {
- rez.copyTo(aux);
- ready = true;
- for (int i = 1; i < rez.rows - 1; i++)
- for (int j = 1; j < rez.cols - 1; j++)
- if (rez.at<uchar>(i, j) == 0)
- {
- for (int k = 0; k < 4; k++)
- if (aux.at<uchar>(i + di[k], j + dj[k]) != 0 && img.at<uchar>(i + di[k], j + dj[k]) != 0) {
- aux.at<uchar>(i + di[k], j + dj[k]) = 0;
- ready = false;
- }
- }
- aux.copyTo(rez);
- } while (!ready);
- for (int i = 1; i < img.rows - 1; i++)
- for (int j = 1; j < img.cols - 1; j++)
- if (img.at<uchar>(i, j) == 0)
- rez.at<uchar>(i, j) = 0;
- imshow("Normal image", img);
- imshow("Umplere", rez);
- waitKey(0);
- }
- /////////lab 8 ////////
- int * histo(Mat &img) {
- //char fname[MAX_PATH];
- //openFileDlg(fname);
- //Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int *h = new int[256]();
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- uchar g = img.at<uchar>(i, j);
- h[g]++;
- }
- showHistogram("histo", h, 256, 500);
- return h;
- waitKey(0);
- }
- void medie() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int *a = histo(img);
- float p[256] = { 0 };
- int M = img.rows*img.cols;
- for (int g = 0; g < 256; g++) {
- p[g] = ((float)a[g] / M);
- }
- float medie = 0;
- for (int g = 0; g < 256; g++) {
- medie += g * p[g];
- }
- printf("Medie=%.2f \n", medie);
- float var = 0;
- for (int g = 0; g < 256; g++) {
- var += (g - medie)*(g - medie)*p[g];
- }
- float sigma = sqrt(var);
- printf("Deviatie=%.2f \n", sigma);
- getchar();
- getchar();
- getchar();
- }
- float calc_sum(int *hist, int min, int max) {
- float sum = 0;
- int number = 0;
- for (int i = min; i < max; i++) {
- sum += i * hist[i];
- number += hist[i];
- }
- return sum / number;
- }
- void binarizare() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int *a = histo(img);
- int imax = 0;
- int imin = 255;
- for (int i = 0; i < 256; i++) {
- if (a[i] != 0) {
- imin = i;
- break;
- }
- }
- for (int i = 255; i > 0; i--) {
- if (a[i] != 0) {
- imax = i;
- break;
- }
- }
- float t1 = (imax + imin) / 2;
- float t2 = 0.0;
- while (t1 - t2 >= 5) {
- int ug1 = calc_sum(a, 0, t1);
- int ug2 = calc_sum(a, t1, 256);
- t1 = t2;
- t2 = (ug1 + ug2) / 2;
- }
- Mat dst = Mat(img.rows, img.cols, CV_8UC1);
- for (int i = 0; i < img.rows; i++)
- {
- for (int j = 0; j < img.cols; j++)
- {
- if (img.at<uchar>(i, j) < t2) {
- dst.at<uchar>(i, j) = 0;
- }
- else {
- dst.at<uchar>(i, j) = 255;
- }
- }
- }
- imshow("dst", dst);
- imshow("img", img);
- waitKey(0);
- }
- void latire_ingustare() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int *a = histo(img);
- Mat cont = img.clone();
- int goutmin, goutmax;
- printf("Introduceti goutmin si g outmax: ");
- scanf("%d %d", &goutmin, &goutmax);
- int imax = 0;
- int imin = 255;
- for (int i = 0; i < 256; i++) {
- if (a[i] != 0) {
- imin = i;
- break;
- }
- }
- for (int i = 255; i > 0; i--) {
- if (a[i] != 0) {
- imax = i;
- break;
- }
- }
- Mat contrast = img.clone();
- float factor = (imax - imin);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- float aux = goutmin + (img.at<uchar>(i, j) - imin)*(goutmax - goutmin) / factor;
- contrast.at<uchar>(i, j) = (int)aux;
- }
- imshow("src", img);
- imshow("Contrast", contrast);
- waitKey(0);
- }
- void corectie_gama() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int *a = histo(img);
- Mat gama = img.clone();
- float gamma;
- printf("introduceti gamma: ");
- scanf("%f", &gamma);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- float aux = pow((float)img.at<uchar>(i, j) / 255, gamma) * 255;
- gama.at<uchar>(i, j) = (int)aux;
- }
- imshow("img", img);
- imshow("gama", gama);
- waitKey(0);
- }
- void modificare_luminozitate() {
- char fname[MAX_PATH];
- openFileDlg(fname);
- Mat img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- int *a = histo(img);
- Mat lumino = img.clone();
- float luminozitate;
- printf("introduceti luminozitate: ");
- scanf("%f", &luminozitate);
- for (int i = 0; i < img.rows; i++)
- for (int j = 0; j < img.cols; j++) {
- float aux = img.at<uchar>(i, j) + luminozitate;
- if (aux > 255) {
- aux = 255;
- }
- lumino.at<uchar>(i, j) = (int)aux;
- }
- imshow("img", img);
- imshow("gama", lumino);
- waitKey(0);
- }
- int main()
- {
- int op;
- do
- {
- system("cls");
- destroyAllWindows();
- printf("Menu:\n");
- printf(" 1 - Open image\n");
- printf(" 2 - Open BMP images from folder\n");
- printf(" 3 - Image negative - diblook style\n");
- printf(" 4 - BGR->HSV\n");
- printf(" 5 - Resize image\n");
- printf(" 6 - Canny edge detection\n");
- printf(" 7 - Edges in a video sequence\n");
- printf(" 8 - Snap frame from live video\n");
- printf(" 9 - Mouse callback demo\n");
- printf(" 0 - Exit\n");
- printf(" 10 - teo\n");
- printf(" 11 - ale\n");
- printf(" 12 - multi\n");
- printf(" 13 - color\n");
- printf(" 14 - INV\n");
- printf(" 15 - Split windows\n");
- printf(" 16 - Color to grayscale\n");
- printf(" 17 - Grayscale to black white\n");
- printf(" 18 - RGB->HSV\n");
- printf(" 19 - isInside\n");
- printf(" 20 - histogram\n");
- printf(" 21 - praguri_multiple\n");
- printf(" 22 - floyd_steinberg\n");
- printf(" 24 - aria\n");
- printf(" 25 - centru de masa\n");
- printf(" 26 - axa de alungire\n");
- printf(" 27 - perimetru\n");
- printf(" 28 - factorul de subtiere al obiectului\n");
- printf(" 29 - imagine Separata\n");
- printf(" 30 - aria+phi\n");
- printf(" 31 - proiectie orizontala\n");
- printf(" 32 - proiectie verticala\n");
- printf(" 33 - BFS\n");
- printf(" 34 - douatreceri\n");
- printf(" 35 - urmarire a conturului\n");
- printf(" 36 - reconstruct\n");
- printf(" 37 - dilatare\n");
- printf(" 38 - erodare\n");
- printf(" 39 - deschidere\n");
- printf(" 40 - inchidere\n");
- printf(" 41 - contur\n");
- printf(" 42 - umplere\n");
- printf(" 44 - medie\n");
- printf(" 45 - contrast\n");
- printf(" 46 - gama\n");
- printf(" 47 - luminozitate\n");
- printf(" 0 - Exit\n");
- printf("Option: ");
- scanf("%d", &op);
- Mat img;
- switch (op)
- {
- case 1:
- testOpenImage();
- break;
- case 2:
- testOpenImagesFld();
- break;
- case 3:
- testParcurgereSimplaDiblookStyle(); //diblook style
- break;
- case 4:
- //testColor2Gray();
- testBGR2HSV();
- break;
- case 5:
- testResize();
- break;
- case 6:
- testCanny();
- break;
- case 7:
- testVideoSequence();
- break;
- case 8:
- testSnap();
- break;
- case 9:
- testMouseClick();
- break;
- case 10:
- testNegativFrumos();
- break;
- case 11:
- testGrayScaleAdditiveFactor();
- break;
- case 12:
- testGrayScaleMultiplyFactor();
- break;
- case 13:
- Patrate_colorate();
- break;
- case 14:
- matricica_inv();
- break;
- case 15:
- split_windows();
- break;
- case 16:
- color_to_grayscale();
- break;
- case 17:
- grayscale_to_black_white();
- break;
- case 18:
- rgb_to_hsv();
- break;
- case 19:
- testIsInside();
- break;
- case 20:
- histogram();
- break;
- case 21:
- praguri_multiple();
- break;
- case 22:
- floyd_steinberg();
- break;
- case 23:
- testIsInside();
- break;
- case 24:
- computeAria();
- break;
- case 25:
- computeCentrulDeMasa();
- break;
- case 26:
- computeElongation();
- break;
- case 27:
- computePerimeter();
- break;
- case 28:
- computeFactorDeSubtiere();
- break;
- case 29:
- computeImagineSeparata();
- break;
- case 30:
- thAria();
- break;
- case 31:
- computeHorizontalProjectionCallback();
- break;
- case 32:
- computeVerticalProjectionCallback();
- break;
- case 33:
- Bfs();
- case 34:
- douaTreceri();
- case 35:
- img = imread("Images/oval_vert.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- contur(img);
- break;
- case 36:
- //img = imread("Images/oval_vert.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- reconstruct();
- break;
- case 37:
- printf("n= ");
- scanf("%d", &n);
- char fname[MAX_PATH];
- openFileDlg(fname);
- img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("Imagine normala", img);
- imshow("Imagine dilatata", dilatare(img, n));
- waitKey(0);
- break;
- case 38:
- printf("n= ");
- scanf("%d", &n);
- //char fname[MAX_PATH];
- openFileDlg(fname);
- img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- //img = imread("imagini_op_morfologice_lab7/Imagini_Op_Morfologice/3_Open/cel4thr3_bw.bmp", CV_LOAD_IMAGE_GRAYSCALE);
- imshow("Imagine normala", img);
- imshow("Imagine erodata", erodare(img, n));
- waitKey(0);
- break;
- case 39:
- openFileDlg(fname);
- img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("Imagine normala", img);
- imshow("Deschidere", deschidere(img));
- waitKey(0);
- break;
- case 40:
- openFileDlg(fname);
- img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
- imshow("Imagine normala", img);
- imshow("Inchidere", inchidere(img));
- waitKey(0);
- break;
- case 41:
- conturMorfologic();
- case 42:
- umplere();
- case 43:
- binarizare();
- case 44:
- medie();
- case 45:
- latire_ingustare();
- case 46:
- corectie_gama();
- case 47:
- modificare_luminozitate();
- }
- } while (op != 0);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement