Advertisement
NikolayChukanov

mainc

Feb 14th, 2024
680
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.04 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <pthread.h>
  4. #include "generator.h"
  5.  
  6. #define MATRIX_SIZE 100 // Размер матрицы
  7. #define FILTER_SIZE 3   // Размер фильтра
  8.  
  9. double matrix[MATRIX_SIZE][MATRIX_SIZE];
  10. double matrix_eroded[MATRIX_SIZE][MATRIX_SIZE];
  11. double matrix_dilated[MATRIX_SIZE][MATRIX_SIZE];
  12.  
  13. // Операция эрозии
  14. void *erosion(void *arg) {
  15.     int *startRow = (int *)arg;
  16.     int endRow = (*startRow) + FILTER_SIZE;
  17.  
  18.     // Временная матрица для хранения результата эрозии
  19.     double tempMatrix[FILTER_SIZE][FILTER_SIZE];
  20.  
  21.     for (int i = *startRow; i < endRow; i++) {
  22.         for (int j = 0; j < MATRIX_SIZE; j++) {
  23.             double min = inputMatrix[i][j]; // Начальное значение минимума
  24.  
  25.             // Проходимся по всем элементам ядра
  26.             for (int k = 0; k < FILTER_SIZE; k++) {
  27.                 for (int l = 0; l < FILTER_SIZE; l++) {
  28.                     // Если вышли за границы матрицы, игнорируем этот элемент ядра
  29.                     if (i + k - FILTER_SIZE/2 < 0 || i + k - FILTER_SIZE/2 >= MATRIX_SIZE ||
  30.                         j + l - FILTER_SIZE/2 < 0 || j + l - FILTER_SIZE/2 >= MATRIX_SIZE) {
  31.                         continue;
  32.                     }
  33.  
  34.                     // Обновляем минимум, если нашли меньшее значение
  35.                     if (inputMatrix[i + k - FILTER_SIZE/2][j + l - FILTER_SIZE/2] < min) {
  36.                         min = inputMatrix[i + k - FILTER_SIZE/2][j + l - FILTER_SIZE/2];
  37.                     }
  38.                 }
  39.             }
  40.  
  41.             // Сохраняем результат эрозии во временной матрице
  42.             tempMatrix[i - *startRow][j] = min;
  43.         }
  44.     }
  45.  
  46.     // Копируем результат эрозии из временной матрицы в выходную матрицу
  47.     for (int i = *startRow; i < endRow; i++) {
  48.         for (int j = 0; j < MATRIX_SIZE; j++) {
  49.             outputMatrix[i][j] = tempMatrix[i - *startRow][j];
  50.         }
  51.     }
  52.  
  53.     pthread_exit(NULL);
  54. }
  55.  
  56. // Операция наращивания
  57. void *dilation(void *arg) {
  58.     int *startRow = (int *)arg;
  59.     int endRow = (*startRow) + FILTER_SIZE;
  60.  
  61.     // Временная матрица для хранения результата наращивания
  62.     double tempMatrix[FILTER_SIZE][FILTER_SIZE];
  63.  
  64.     for (int i = *startRow; i < endRow; i++) {
  65.         for (int j = 0; j < MATRIX_SIZE; j++) {
  66.             double max = inputMatrix[i][j]; // Начальное значение максимума
  67.  
  68.             // Проходимся по всем элементам ядра
  69.             for (int k = 0; k < FILTER_SIZE; k++) {
  70.                 for (int l = 0; l < FILTER_SIZE; l++) {
  71.                     // Если вышли за границы матрицы, игнорируем этот элемент ядра
  72.                     if (i + k - FILTER_SIZE/2 < 0 || i + k - FILTER_SIZE/2 >= MATRIX_SIZE ||
  73.                         j + l - FILTER_SIZE/2 < 0 || j + l - FILTER_SIZE/2 >= MATRIX_SIZE) {
  74.                         continue;
  75.                     }
  76.  
  77.                     // Обновляем максимум, если нашли большее значение
  78.                     if (inputMatrix[i + k - FILTER_SIZE/2][j + l - FILTER_SIZE/2] > max) {
  79.                         max = inputMatrix[i + k - FILTER_SIZE/2][j + l - FILTER_SIZE/2];
  80.                     }
  81.                 }
  82.             }
  83.  
  84.             // Сохраняем результат наращивания во временной матрице
  85.             tempMatrix[i - *startRow][j] = max;
  86.         }
  87.     }
  88.  
  89.     // Копируем результат наращивания из временной матрицы в выходную матрицу
  90.     for (int i = *startRow; i < endRow; i++) {
  91.         for (int j = 0; j < MATRIX_SIZE; j++) {
  92.             outputMatrix[i][j] = tempMatrix[i - *startRow][j];
  93.         }
  94.     }
  95.  
  96.     pthread_exit(NULL);
  97. }
  98.  
  99. int main() {
  100.     generate_matrix(matrix);
  101.     // Загрузка данных в матрицу (можно использовать случайные значения для примера)
  102.     // Ваш код для загрузки данных в матрицу здесь
  103.  
  104.     // Создание потоков
  105.     pthread_t threads[MATRIX_SIZE - FILTER_SIZE + 1];
  106.     int threadArgs[MATRIX_SIZE - FILTER_SIZE + 1];
  107.  
  108.     // Запуск потоков для фильтрации эрозией
  109.     for (int i = 0; i < MATRIX_SIZE - FILTER_SIZE + 1; i++) {
  110.         threadArgs[i] = i;
  111.         pthread_create(&threads[i], NULL, erosion, &threadArgs[i]);
  112.     }
  113.  
  114.     // Ожидание завершения потоков
  115.     for (int i = 0; i < MATRIX_SIZE - FILTER_SIZE + 1; i++) {
  116.         pthread_join(threads[i], NULL);
  117.     }
  118.  
  119.     // Запуск потоков для фильтрации наращиванием
  120.     for (int i = 0; i < MATRIX_SIZE - FILTER_SIZE + 1; i++) {
  121.         threadArgs[i] = i;
  122.         pthread_create(&threads[i], NULL, dilation, &threadArgs[i]);
  123.     }
  124.  
  125.     // Ожидание завершения потоков
  126.     for (int i = 0; i < MATRIX_SIZE - FILTER_SIZE + 1; i++) {
  127.         pthread_join(threads[i], NULL);
  128.     }
  129.  
  130.     // Сохранение результатов в файл или вывод на экран
  131.     // Ваш код для сохранения результатов здесь
  132.     printf("Result of erosion:\n");
  133.     for (int i = 0; i < MATRIX_SIZE; ++i){
  134.     for (int j = 0; j < MATRIX_SIZE; ++j){
  135.        printf("%f", result_dilated[i][j]);
  136.         }
  137.         printf("\n");
  138.     }
  139.    
  140.     printf("Result of dilation:\n");
  141.     for (int i = 0; i < MATRIX_SIZE; ++i){
  142.     for (int j = 0; j < MATRIX_SIZE; ++j){
  143.        printf("%f", result_dilated[i][j]);
  144.         }
  145.         printf("\n");
  146.     }
  147.    
  148.     return 0;
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement