как точить изображение в opencv?

<p>как повысить резкость изображения с помощью <strong>opencv</strong>? есть много способов сглаживания или размытия, но ни одного, который я мог бы видеть, обострять.</p>

<p>одна общая процедура изложена в <a href="http://en.wikipedia.org/wiki/unsharp\_masking#digital\_unsharp\_masking">статья в википедии о нечетком маскировании</a> : вы используете гауссовский фильтр сглаживания и вычитаете сглаженную версию из исходного изображения (взвешенным способом, так что значения постоянной области остаются постоянными ).</p><p>чтобы получить заостренную версию <code>frame</code> в <code>image</code>: (оба <code>cv::mat</code>)</p><pre><code>cv::gaussianblur(frame, image, cv::size(0, 0), 3); cv::addweighted(frame, 1.5, image, -0.5, 0, image); </code></pre><p>в параметрах есть что-то, что вам нужно настроить для себя.</p><p>есть также резкость по лапласу, вы должны найти что-то об этом, когда вы google.</p>

<p>вы можете попробовать простое <strong> ядро </strong> и <strong> <a href="http://docs.opencv.org/modules/imgproc/doc/filtering.html#filter2d">filter2d</a> </strong> функция, например в python:</p><pre><code>kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) im = cv2.filter2d(im, -1, kernel) </code></pre><p>в википедии есть хороший обзор ядер с некоторыми другими примерами здесь - <a href="https://en.wikipedia.org/wiki/kernel\_(image\_processing)">https://en.wikipedia.org/wiki/kernel\_ (image\_processing)</a> </p><blockquote> <p>при обработке изображений ядро, матрица свертки или маска - это маленькая матрица. он используется для размытия, повышения резкости, тиснения, обнаружения краев и многого другого. это достигается путем свертки между ядром и изображением.</p> </blockquote>

<p>вы можете найти пример кода о <strong> повышении резкости изображения с помощью алгоритма "нерезкая маска" </strong> в <a href="http://docs.opencv.org/master/d1/d10/classcv\_1\_1matexpr.html#details">документация opencv</a> .</p><p>изменение значений <code>sigma</code>, <code>threshold</code>, <code>amount</code> даст разные результаты.</p><pre class="lang-cpp prettyprint-override"><code>// sharpen image using "unsharp mask" algorithm mat blurred; double sigma = 1, threshold = 5, amount = 1; gaussianblur(img, blurred, size(), sigma, sigma); mat lowcontrastmask = abs(img - blurred) < threshold; mat sharpened = img*(1+amount) + blurred*(-amount); img.copyto(sharpened, lowcontrastmask); </code></pre>

<blockquote> <p>любое изображение представляет собой совокупность сигналов различных частот. более высокие частоты контролируют края, а более низкие частоты контролируют содержание изображения. края формируются, когда в соседней ячейке происходит резкий переход от значения одного пикселя к значению другого пикселя, например 0 и 255. очевидно, что есть резкое изменение и, следовательно, край и высокая частота. для повышения резкости изображения эти переходы могут быть дополнительно улучшены.</p> </blockquote><p>одним из способов является свертывание ядра фильтра с изображением.</p><pre><code>import cv2 import numpy as np image = cv2.imread('images/input.jpg') kernel = np.array([[-1,-1,-1], [-1, 9,-1], [-1,-1,-1]]) sharpened = cv2.filter2d(image, -1, kernel) # applying the sharpening kernel to the input image & displaying it. cv2.imshow('image sharpening', sharpened) cv2.waitkey(0) cv2.destroyallwindows() </code></pre><p>есть еще один метод вычитания размытой версии изображения из его яркой версии. это помогает повысить резкость изображения. но это следует делать с осторожностью, так как мы просто увеличиваем значения пикселей. представьте себе значение 190 в градациях серого, которое при умножении на вес 2 составляет 380, но обрезается до 255 из-за максимально допустимого диапазона пикселей. это потеря информации и приводит к размыванию изображения.</p><pre><code>addweighted(frame, 1.5, image, -0.5, 0, image); </code></pre>

<p>для ясности в этой теме следует сделать несколько замечаний:</p><ol> <li> <p>резкость изображений - некорректная проблема. другими словами, размытие - это операция с потерями, и возврат к ней вообще невозможен.</p> </li> <li> <p>чтобы повысить резкость отдельных изображений, необходимо каким-то образом добавить ограничения (предположения) о том, какое изображение вы хотите получить, и как оно стало размытым. это область статистики естественных изображений. подходы к повышению резкости держат эту статистику явно или неявно в своих алгоритмах (глубокое обучение является наиболее неявно кодируемыми). общий подход увеличения веса некоторых уровней <a href="https://en.wikipedia.org/wiki/pyramid\_(image\_processing)#laplacian\_pyramid">собака или разложение лапласовой пирамиды</a> , который является обобщением ответа брайана бернса, предполагает, что размытие по гауссу повредило изображение, и как выполняется взвешивание связано с предположениями о том, что было в изображении для начала.</p> </li> <li> <p>другие источники информации могут помочь обострить проблему. распространенными такими источниками информации являются видео движущегося объекта или настройка нескольких просмотров. повышение резкости в этом параметре обычно называется <a href="https://en.wikipedia.org/wiki/super-resolution\_imaging">супер-разрешение</a> (это очень плохое название, но оно застряло в академических кругах). там было <a href="https://docs.opencv.org/2.4/modules/superres/doc/super\_resolution.html">методы суперразрешения в opencv</a> с давних пор .... хотя они обычно не работают так хорошо для реальных проблем, в последний раз я их проверял. я ожидаю, что глубокое обучение дало здесь и замечательные результаты. может быть, кто-то напишет в комментариях о том, что там стоит.</p> </li> </ol>

<p>вы можете повысить резкость изображения, используя <a href="https://en.wikipedia.org/wiki/unsharp\_masking">нерезкая маска</a> . вы можете найти больше информации о нечеткой маскировке <a href="https://homepages.inf.ed.ac.uk/rbf/hipr2/unsharp.htm">здесь</a> . а вот реализация python с использованием opencv:</p><pre class="lang-py prettyprint-override"><code>import cv2 as cv import numpy as np def unsharp\_mask(image, kernel\_size=(5, 5), sigma=1.0, amount=1.0, threshold=0): """return a sharpened version of the image, using an unsharp mask.""" blurred = cv.gaussianblur(image, kernel\_size, sigma) sharpened = float(amount + 1) * image - float(amount) * blurred sharpened = np.maximum(sharpened, np.zeros(sharpened.shape)) sharpened = np.minimum(sharpened, 255 * np.ones(sharpened.shape)) sharpened = sharpened.round().astype(np.uint8) if threshold > 0: low\_contrast\_mask = np.absolute(image - blurred) < threshold np.copyto(sharpened, image, where=low\_contrast\_mask) return sharpened def example(): image = cv.imread('my-image.jpg') sharpened\_image = unsharp\_mask(image) cv.imwrite('my-sharpened-image.jpg', sharpened\_image) </code></pre>

<p>для повышения резкости изображения мы можем использовать фильтр (как во многих ответах выше)</p><pre><code>kernel = np.array([[-1, -1, -1],[-1, 8, -1],[-1, -1, 0]], np.float32) kernel/=denominator*kernel it will the most when the denominator is 1 and will decrease as increased(2.3..) the most used one is when the denominator is 3. </code></pre><p>ниже реализация.</p><p>kernel = np.array ([[- 1, -1, -1], [- 1, 8, -1], [- 1, -1, 0]], np.float32)</p><p>ядро = 1/3 * ядро</p><p>дст = cv2.filter2d (изображение, -1, ядро)</p>