#include int compare(const void * a, const void * b) { return (*(int*)a - *(int*)b); } uchar median(cv::Mat image, int rec_size) { uchar* tab = new uchar[rec_size*rec_size]; int tmp = 0; for (int i = -rec_size / 2; i < rec_size / 2; i++) { for (int j = -rec_size / 2; j < rec_size / 2; j++) { tab[tmp] = image.at(j, i); tmp += 1; } } qsort(tab, rec_size*rec_size, sizeof(uchar), compare); uchar med; if (rec_size*rec_size % 2 == 0) { med = (tab[rec_size / 2] + tab[rec_size / 2 + 1]) / 2; } else { med = tab[rec_size / 2]; } return med; } void filter(cv::Mat& image, int a) { for (int i = a / 2; i < image.cols - a / 2; i++) { for (int j = a / 2; j < image.rows - a / 2; j++) { image.at(j, i) = median(image, a); } } } int main() { std::string img_path = "C:\[..]\lena.png"; cv::Mat img = cv::imread(img_path); int rozmiar; filter(img, rozmiar); img.release(); cv::destroyAllWindows(); return 0; }