博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
opencv3 图像处理——滤波
阅读量:1860 次
发布时间:2019-04-26

本文共 8093 字,大约阅读时间需要 26 分钟。

高通滤波器: 通过检测图像的某个区域,然后根据像素与周围像素的亮度差值来提升该像素的亮度的滤波器,在计算完中央像素与周围邻近像素的亮度差值之和以后,如果亮度变化很大,中央像素的亮度会增加(反之则不会)。换句话说,如果一个像素比它周围的像素更突出,就会提升它的亮度。这在边缘检测上尤其有效,它会采用一种称为高频提升滤波器(high boost filter)的高通滤波器。高通和低通滤波器都有一个称为半径(radius)的属性,它决定了多大面积的邻近像素参与滤波计算

import cv2import numpy as npfrom skimage import io from scipy import ndimagekernel_3x3 = np.array([[-1, -1, -1],                   [-1,  8, -1],                   [-1, -1, -1]])kernel_5x5 = np.array([[-1, -1, -1, -1, -1],                       [-1,  1,  2,  1, -1],                       [-1,  2,  4,  2, -1],                       [-1,  1,  2,  1, -1],                       [-1, -1, -1, -1, -1]])img = io.imread(r"D:\F\eclipse-workspace\imagop\src\1.png",as_grey=True)k3 = ndimage.convolve(img, kernel_3x3)k5 = ndimage.convolve(img, kernel_5x5)blurred = cv2.GaussianBlur(img, (17,17), 0)g_hpf = img - blurredcv2.namedWindow('3x3', 0)cv2.imshow("3x3", k3)cv2.namedWindow('5x5', 0)cv2.imshow("5x5", k5)cv2.namedWindow('g_hpf', 0)cv2.imshow("g_hpf", g_hpf)cv2.waitKey(0)cv2.destroyAllWindows()

输出:

    

    描绘边缘并模拟肖像胶卷色彩

cameo.py

import cv2import filtersfrom managers import WindowManager, CaptureManagerclass Cameo(object):        def __init__(self):        self._windowManager = WindowManager('Cameo',                                             self.onKeypress)        self._captureManager = CaptureManager(            cv2.VideoCapture(0), self._windowManager, True)        self._curveFilter = filters.BGRPortraCurveFilter()        def run(self):        """Run the main loop."""        self._windowManager.createWindow()        while self._windowManager.isWindowCreated:            self._captureManager.enterFrame()            frame = self._captureManager.frame                        if frame is not None:                                # TODO: Track faces (Chapter 3).                                filters.strokeEdges(frame, frame)                self._curveFilter.apply(frame, frame)                        self._captureManager.exitFrame()            self._windowManager.processEvents()        def onKeypress(self, keycode):        """Handle a keypress.                space  -> Take a screenshot.        tab    -> Start/stop recording a screencast.        escape -> Quit.                """        if keycode == 32: # space            self._captureManager.writeImage('screenshot.png')        elif keycode == 9: # tab            if not self._captureManager.isWritingVideo:                self._captureManager.startWritingVideo(                    'screencast.avi')            else:                self._captureManager.stopWritingVideo()        elif keycode == 27: # escape            self._windowManager.destroyWindow()if __name__=="__main__":    Cameo().run()
managers.py
import cv2import numpyimport timeclass CaptureManager(object):        def __init__(self, capture, previewWindowManager = None,                 shouldMirrorPreview = False):                self.previewWindowManager = previewWindowManager        self.shouldMirrorPreview = shouldMirrorPreview                self._capture = capture        self._channel = 0        self._enteredFrame = False        self._frame = None        self._imageFilename = None        self._videoFilename = None        self._videoEncoding = None        self._videoWriter = None                self._startTime = None        self._framesElapsed = int(0)        self._fpsEstimate = None        @property    def channel(self):        return self._channel        @channel.setter    def channel(self, value):        if self._channel != value:            self._channel = value            self._frame = None        @property    def frame(self):        if self._enteredFrame and self._frame is None:            # As of OpenCV 3.0, VideoCapture.retrieve() no longer supports            # the channel argument.            # _, self._frame = self._capture.retrieve(channel = self.channel)            _, self._frame = self._capture.retrieve()        return self._frame        @property    def isWritingImage(self):        return self._imageFilename is not None        @property    def isWritingVideo(self):        return self._videoFilename is not None        def enterFrame(self):        """Capture the next frame, if any."""                # But first, check that any previous frame was exited.        assert not self._enteredFrame, \            'previous enterFrame() had no matching exitFrame()'                if self._capture is not None:            self._enteredFrame = self._capture.grab()        def exitFrame(self):        """Draw to the window. Write to files. Release the frame."""                # Check whether any grabbed frame is retrievable.        # The getter may retrieve and cache the frame.        if self.frame is None:            self._enteredFrame = False            return                # Update the FPS estimate and related variables.        if self._framesElapsed == 0:            self._startTime = time.time()        else:            timeElapsed = time.time() - self._startTime            self._fpsEstimate =  self._framesElapsed / timeElapsed        self._framesElapsed += 1                # Draw to the window, if any.        if self.previewWindowManager is not None:            if self.shouldMirrorPreview:                mirroredFrame = numpy.fliplr(self._frame).copy()                self.previewWindowManager.show(mirroredFrame)            else:                self.previewWindowManager.show(self._frame)                # Write to the image file, if any.        if self.isWritingImage:            cv2.imwrite(self._imageFilename, self._frame)            self._imageFilename = None                # Write to the video file, if any.        self._writeVideoFrame()                # Release the frame.        self._frame = None        self._enteredFrame = False        def writeImage(self, filename):        """Write the next exited frame to an image file."""        self._imageFilename = filename        def startWritingVideo(            self, filename,            encoding = cv2.VideoWriter_fourcc('M','J','P','G')):        """Start writing exited frames to a video file."""        self._videoFilename = filename        self._videoEncoding = encoding        def stopWritingVideo(self):        """Stop writing exited frames to a video file."""        self._videoFilename = None        self._videoEncoding = None        self._videoWriter = None        def _writeVideoFrame(self):                if not self.isWritingVideo:            return                if self._videoWriter is None:            fps = self._capture.get(cv2.CAP_PROP_FPS)            if fps <= 0.0:                # The capture's FPS is unknown so use an estimate.                if self._framesElapsed < 20:                    # Wait until more frames elapse so that the                    # estimate is more stable.                    return                else:                    fps = self._fpsEstimate            size = (int(self._capture.get(                        cv2.CAP_PROP_FRAME_WIDTH)),                    int(self._capture.get(                        cv2.CAP_PROP_FRAME_HEIGHT)))            self._videoWriter = cv2.VideoWriter(                self._videoFilename, self._videoEncoding,                fps, size)                self._videoWriter.write(self._frame)class WindowManager(object):        def __init__(self, windowName, keypressCallback = None):        self.keypressCallback = keypressCallback                self._windowName = windowName        self._isWindowCreated = False        @property    def isWindowCreated(self):        return self._isWindowCreated        def createWindow(self):        cv2.namedWindow(self._windowName)        self._isWindowCreated = True        def show(self, frame):        cv2.imshow(self._windowName, frame)        def destroyWindow(self):        cv2.destroyWindow(self._windowName)        self._isWindowCreated = False        def processEvents(self):        keycode = cv2.waitKey(1)        if self.keypressCallback is not None and keycode != -1:            # Discard any non-ASCII info encoded by GTK.            keycode &= 0xFF            self.keypressCallback(keycode)

截图效果:

你可能感兴趣的文章
RedHat Linux下注册Apache为系统服务
查看>>
使用LoadRunner监控Apache的步骤
查看>>
LoadRunner录制脚本时报加载GrooveUtil.dll出错的解决方法
查看>>
用Spotlight实时监控Windows Server 2008
查看>>
Tomcat 6.0.32中调整JVM大小及最大线程数
查看>>
Mysql数据库下载及安装
查看>>
MySql安装时解决要输入current root password的方法
查看>>
Linux下free命令详解
查看>>
Linux下启动rpc时提示Cannot register service: RPC: Unableto receive; errno = Connectionrefused的问题
查看>>
Google纪念遗传学之父孟德尔诞辰一百周年图标
查看>>
在Apache下配置多个虚拟主机站点
查看>>
【学习笔记】Linux下CPU性能评估
查看>>
【学习笔记】Linux下内存性能评估
查看>>
【学习笔记】Linux下磁盘IO性能评估
查看>>
python
查看>>
网络协议
查看>>
进程和线程
查看>>
sql面试题
查看>>
linux基础与调优
查看>>
软件缺陷基础
查看>>