Python与FPGA——图像锐化

news2024/11/18 1:46:12

文章目录

  • 前言
  • 一、图像锐化
  • 二、Python robert锐化
  • 三、Python sobel锐化
  • 四、Python laplacian锐化
  • 五、FPGA sobel锐化
  • 总结


前言

  在增强图像之前一般会先对图像进行平滑处理以减少或消除噪声,图像的能量主要集中在低频部分,而噪声和图像边缘信息的能量主要集中在高频部分。因此,平滑处理会使原始的图像边缘和轮廓变得模糊。为了减少不利效果的影响,需要利用图像锐化技术。


一、图像锐化

  图像锐化其实就是使用robert,sobel,laplacian这些人发明的窗口,进行图像的处理。图像锐化过程和sobel边缘检测的过程类似,可以移步至《Python与FPGA——sobel边缘检测》课程,一探究竟。

一阶微分的边缘检测
  图像f(x, y)在像素(x, y)梯度的定义为
G = ∂ f ∂ x + ∂ f ∂ y G = \frac{\partial f}{\partial x} + \frac{\partial f}{\partial y} G=xf+yf
也可以用差分来替代微分,即
∂ f ∂ x = f ( i + 1 , j ) − f ( i , j ) \frac{\partial f}{\partial x} = f(i + 1, j) - f(i, j) xf=f(i+1,j)f(i,j)
∂ f ∂ y = f ( i , j + 1 ) − f ( i , j ) \frac{\partial f}{\partial y} = f(i, j + 1) - f(i, j) yf=f(i,j+1)f(i,j)
梯度的幅值即模值,为
∣ G ∣ = ( ∂ f ∂ x ) 2 + ( ∂ f ∂ y ) 2 = [ f ( i + 1 , j ) − f ( i , j ) ] 2 + [ f ( i , j ) − f ( i , j ) ] 2 |G| = \sqrt{(\frac{\partial f}{\partial x})^2 + (\frac{\partial f}{\partial y})^2} = \sqrt{[f(i + 1, j) - f(i, j)]^2 + [f(i, j ) - f(i, j)]^2} G=(xf)2+(yf)2 =[f(i+1,j)f(i,j)]2+[f(i,j)f(i,j)]2
梯度方向为
θ = a r c t a n ( ∂ f ∂ y / ∂ f ∂ x ) = a r c t a n [ f ( i , j + 1 ) − f ( i , j ) f ( i + 1 , j ) − f ( i , j ) ] \theta = arctan(\frac{\partial f}{\partial y}/\frac{\partial f}{\partial x}) = arctan[\frac{f(i, j + 1) - f(i, j)}{f(i + 1, j) - f(i, j)}] θ=arctan(yf/xf)=arctan[f(i+1,j)f(i,j)f(i,j+1)f(i,j)]
图像f(i, j)处的梯度g为
g ( i , j ) = G [ f ( i , j ) ] g(i, j) = G[f(i, j)] g(i,j)=G[f(i,j)]
使用 g ( i , j ) g(i, j) g(i,j)去替代原来的像素。
  一阶导算子有robert算子,perwitt算子,sobel算子。
1. Roberts算子
G x = [ 1 0 0 − 1 ] G y = [ 0 − 1 1 0 ] G_x = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix} \quad\quad\quad G_y = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} Gx=[1001]Gy=[0110]
2. Prewitt算子
G x = [ − 1 0 1 − 1 0 1 − 1 0 1 ] G y = [ − 1 − 1 − 1 0 0 0 1 1 1 ] G_x = \begin{bmatrix} -1 & 0 & 1\\ -1 & 0 & 1\\ -1 & 0 & 1 \end{bmatrix} \quad\quad\quad G_y = \begin{bmatrix} -1 & -1 & -1\\ 0 & 0 & 0\\ 1 & 1 & 1 \end{bmatrix} Gx=111000111Gy=101101101
3. Sobel算子
G x = [ − 1 0 + 1 − 2 0 + 2 − 1 0 + 1 ] G y = [ + 1 + 2 + 1 0 0 0 − 1 − 2 1 ] G_x = \begin{bmatrix} -1 & 0 & +1\\ -2 & 0 & +2\\ -1 & 0 & +1 \end{bmatrix} \quad\quad\quad G_y = \begin{bmatrix} +1 & +2 & +1\\ 0 & 0 & 0\\ -1 & -2 & 1 \end{bmatrix} Gx=121000+1+2+1Gy=+101+202+101

二阶微分的边缘检测
  二阶微分公式用差分法,推理如下
∂ 2 f ∂ x 2 = 2 f ( x , y ) − f ( x − 1 , y ) − f ( x + 1 , y ) \frac{\partial^2 f}{\partial x^2}=2f(x,y)-f(x-1,y)-f(x+1, y) x22f=2f(x,y)f(x1,y)f(x+1,y)
∂ 2 f ∂ y 2 = 2 f ( x , y ) − f ( x , y − 1 ) − f ( x , y + 1 ) \frac{\partial^2 f}{\partial y^2}=2f(x,y)-f(x,y-1)-f(x, y+1) y22f=2f(x,y)f(x,y1)f(x,y+1)
▽ 2 f = 4 f ( x , y ) − [ f ( x − 1 , y ) + f ( x , y − 1 ) + f ( x , y + 1 ) + f ( x + 1 , y ) ] \triangledown^2f=4f(x,y)-[f(x-1,y)+f(x,y-1)+f(x,y+1)+f(x+1,y)] 2f=4f(x,y)[f(x1,y)+f(x,y1)+f(x,y+1)+f(x+1,y)]
符合二阶微分的算子是laplacian。

G x = [ 0 − 1 0 − 1 4 − 1 0 − 1 0 ] G y = [ − 1 − 1 − 1 − 1 8 − 1 − 1 − 1 − 1 ] G_x = \begin{bmatrix} 0 & -1 & 0\\ -1 & 4 & -1\\ 0 & -1 & 0 \end{bmatrix} \quad\quad\quad G_y = \begin{bmatrix} -1 & -1 & -1\\ -1 & 8 & -1\\ -1 & -1 & -1 \end{bmatrix} Gx=010141010Gy=111181111

二、Python robert锐化

import numpy as np
import matplotlib.pyplot as plt
def image_gray(image):
    gray = np.dot(image[:, :, ...], [0.299, 0.587, 0.114])#等同0.299 * image[:, :, 0] + 0.587 * image[:, :, 1] + 0.114 * image[:, :, 2]
    return gray.astype(np.uint8)
    
def robert_sharpen(image, gx, gy):
    h, w = image.shape
    n, n = gx.shape
    filtered_image = np.zeros((h, w))
    m = int(n / 2)
    for i in range(m, h - m):
        for j in range(m, w - m):   
            gx_value = np.sum(np.multiply(gx, image[i - m: i + m, j - m: j + m]))
            gy_value = np.sum(np.multiply(gy, image[i - m: i + m, j - m: j + m]))
            gxy_value = np.sqrt(gx_value ** 2 + gy_value ** 2)
            filtered_image[i, j] = gxy_value
    return filtered_image.astype(np.uint8)
    
img = plt.imread("lenna.png")
img = img * 255#图像是[0-1]--->[0-255],确认一下自己的图像是[0-1]还是[0-255]
img = img.astype(np.uint8)
gx = np.array([[1, 0],
               [0, -1]])
gy = np.array([[0, 1],
               [-1, 0]])
gray = image_gray(img)
robert_image = robert_sharpen(gray, gx, gy)
fig = plt.figure(figsize=(10, 6))
ax = plt.subplot(1, 2, 1)
ax.set_title("raw image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(gray, cmap="gray")
ax = plt.subplot(1, 2, 2)
ax.set_title("robert image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(robert_image, cmap="gray")

在这里插入图片描述

三、Python sobel锐化

import numpy as np
import matplotlib.pyplot as plt
def image_gray(image):
    gray = np.dot(image[:, :, ...], [0.299, 0.587, 0.114])#等同0.299 * image[:, :, 0] + 0.587 * image[:, :, 1] + 0.114 * image[:, :, 2]
    return gray.astype(np.uint8)
    
def sobel_sharpen(image, gx, gy):
    h, w = image.shape
    n, n = gx.shape
    filtered_image = np.zeros((h, w))
    m = int((n-1) / 2)
    for i in range(m, h - m):
        for j in range(m, w - m):   
            gx_value = np.sum(np.multiply(gx, image[i - m: i + m + 1, j - m: j + m + 1]))
            gy_value = np.sum(np.multiply(gy, image[i - m: i + m + 1, j - m: j + m + 1]))
            gxy_value = np.sqrt(gx_value ** 2 + gy_value ** 2)
            filtered_image[i, j] = gxy_value
    return filtered_image.astype(np.uint8)
    
img = plt.imread("lenna.png")
img = img * 255#图像是[0-1]--->[0-255],确认一下自己的图像是[0-1]还是[0-255]
img = img.astype(np.uint8)
gx = np.array([[-1, 0, 1],
               [-2, 0, 2],
               [-1, 0, 1]])
gy = np.array([[-1, -2, -1],
               [0, 0, 0],
               [1, 2, 1]])
gray = image_gray(img)
sobel_image = sobel_sharpen(gray, gx, gy)
fig = plt.figure(figsize=(10, 6))
ax = plt.subplot(1, 2, 1)
ax.set_title("raw image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(gray, cmap="gray")
ax = plt.subplot(1, 2, 2)
ax.set_title("sobel image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(sobel_image, cmap="gray")

在这里插入图片描述

四、Python laplacian锐化

import numpy as np
import matplotlib.pyplot as plt
def image_gray(image):
    gray = np.dot(image[:, :, ...], [0.299, 0.587, 0.114])#等同0.299 * image[:, :, 0] + 0.587 * image[:, :, 1] + 0.114 * image[:, :, 2]
    return gray.astype(np.uint8)
    
def laplacian_sharpen(image, gx, gy):
    h, w = image.shape
    n, n = gx.shape
    filtered_image = np.zeros((h, w))
    m = int((n-1) / 2)
    for i in range(m, h - m):
        for j in range(m, w - m):   
            gx_value = np.sum(np.multiply(gx, image[i - m: i + m + 1, j - m: j + m + 1]))
            gy_value = np.sum(np.multiply(gy, image[i - m: i + m + 1, j - m: j + m + 1]))
            gxy_value = np.sqrt(gx_value ** 2 + gy_value ** 2)
            filtered_image[i, j] = gxy_value
    return filtered_image.astype(np.uint8)
    
img = plt.imread("lenna.png")
img = img * 255#图像是[0-1]--->[0-255],确认一下自己的图像是[0-1]还是[0-255]
img = img.astype(np.uint8)
gx = np.array([[0, -1, 0],
               [-1, 4, -1],
               [0, -1, 0]])
gy = np.array([[-1, -1, -1],
               [-1, 8, -1],
               [-1, -1, -1]])
gray = image_gray(img)
sobel_image = sobel_sharpen(gray, gx, gy)
fig = plt.figure(figsize=(10, 6))
ax = plt.subplot(1, 2, 1)
ax.set_title("raw image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(gray, cmap="gray")
ax = plt.subplot(1, 2, 2)
ax.set_title("sobel image")
ax.set_xlabel("width")
ax.set_ylabel("height")
plt.imshow(sobel_image, cmap="gray")

在这里插入图片描述

五、FPGA sobel锐化

//3*3图像
//P11   P12   P13
//P21   P22   P23
//P31   P32   P33

//Gx算子
//-1     0     1
//-2     0     2
//-1     0     1
//Gx = -P11 + P13 - 2*P21 + 2*P23 - P31 + P33
//Gx = (P13 - P11) + 2*(P23 - P21) + (P33 - P31)

//Gy算子
//1      2     1
//0      0     0
//-1     -2    -1
//Gy = P11 + 2*P12 + P13 - P31 - 2*P32 - P33
//Gy = (P11 - P31) + 2*(P12 - P32) + (P13 - P33)
module  ycbcr_sobel_sharpen
(
	input	wire			sys_clk		,	//系统时钟,频率为50MHZ
	input	wire			sys_rst_n	,	//系统复位,低电平有效
	input	wire			rgb_valid	,	//RGB565图像显示有效信号
	input	wire	[7:0]	y_data		,	//Y分量
	input	wire	[11:0]	pixel_x		,	//有效显示区域横坐标
	input	wire	[11:0]	pixel_y		,	//有效显示区域纵坐标
	
	output	reg		[15:0]	sobel_data		//Sobel算法处理后的图像数据
);

reg				y_valid		;	//Y分量有效信号
//shift ram
wire	[7:0]	data_row1	;	//移位寄存器第一行数据
wire	[7:0]	data_row2	;	//移位寄存器第二行数据
wire	[7:0]	data_row3	;	//移位寄存器第三行数据
//3*3像素数据,左上角至右下角共9个数据
reg		[7:0]	p11			;	//3*3第1个像素数据
reg		[7:0]	p12			;	//3*3第2个像素数据
reg		[7:0]	p13			;	//3*3第3个像素数据
reg		[7:0]	p21			;	//3*3第4个像素数据
reg		[7:0]	p22			;	//3*3第5个像素数据
reg		[7:0]	p23			;	//3*3第6个像素数据
reg		[7:0]	p31			;	//3*3第7个像素数据
reg		[7:0]	p32			;	//3*3第8个像素数据
reg		[7:0]	p33			;	//3*3第9个像素数据
//Sobel算子
wire	[15:0]	Gx			;	//水平梯度值
wire	[15:0]	Gy			;	//数值梯度值
wire	[7:0]	Gxy			;	//总体梯度值

assign  data_row3 = y_data  ;
assign  Gx = (p13 - p11) + 2*(p23 - p21) + (p33 - p31)  ;
assign  Gy = (p11 - p31) + 2*(p12 - p32) + (p13 - p33)  ;

//设定第一行、第二行,第一列、第二列显示全白色
always@(*)
	if((pixel_y == 12'd0)||(pixel_y == 12'd1)||(pixel_x == 12'd2)||(pixel_x == 12'd3))
		sobel_data = 16'hffff  ;
	else
		sobel_data = {Gxy[7:3],Gxy[7:2],Gxy[7:3]}  ;//锐化核心代码

always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		y_valid  <=  1'b0  ;
	else
		y_valid  <=  rgb_valid  ;

always@(posedge sys_clk or negedge sys_rst_n)
	if(sys_rst_n == 1'b0)
		begin
			{p11,p12,p13}  <=  24'd0  ;
			{p21,p22,p23}  <=  24'd0  ;
			{p31,p32,p33}  <=  24'd0  ;
		end
	else  if(y_valid == 1'b1)
		begin
			{p11,p12,p13}  <= {p12,p13,data_row1}  ;
			{p21,p22,p23}  <= {p22,p23,data_row2}  ;
			{p31,p32,p33}  <= {p32,p33,data_row3}  ;
		end	
	else
		begin
			{p11,p12,p13}  <=  24'd0  ;
			{p21,p22,p23}  <=  24'd0  ;
			{p31,p32,p33}  <=  24'd0  ;
		end		

shift_ram_gen  shift_ram_gen_inst
(
	.clock 		(sys_clk	),
	.shiftin	(data_row3	),
	.shiftout 	(			),
	.taps0x 	(data_row2	),
	.taps1x 	(data_row1	)
);

sqrt_gen  sqrt_gen_inst 
(
	.radical	(Gx*Gx + Gy*Gy),
	.q 			(Gxy	),
	.remainder 	()
);

endmodule

在这里插入图片描述


总结

  图像锐化就到此结束,剩下的交给小伙伴自行实现。Python的prewitt实现;FPGA的robert、prewitt、laplacian算子实现,你都可以尝试。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1499224.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

结构体:位段(C语言进阶)(二)

目录 前言 2、位段 2.1 什么是位段 2.2 位段的内存分配 2.3 位段的跨平台问题 2.4 位段的应用 总结 前言 C语言除了有其内置类型&#xff0c;还有自定义类型。因为在实际运用中&#xff0c;我们可能会遇到一类数据&#xff0c;它的内容是由多种数据组成的&#xff0c;例如&…

27.基于springboot + vue实现的前后端分离-网上租赁交易系统(项目 + 论文)

项目介绍 本课题是根据用户的需要以及网络的优势建立的一个基于Spring Boot的网上租贸系统&#xff0c;来满足用户网络商品租赁的需求。本网上租贸系统应用Java技术&#xff0c;MYSQL数据库存储数据&#xff0c;基于Spring Boot框架开发。在网站的整个开发过程中&#xff0c;首…

centos离线安装 k8s (实操可用)

全部安装包rpm下载&#xff08;已整理好k8s和docker&#xff09;&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1ATv8BPijhvIKWz4hMnkx6Q?pwdt5db 提取码&#xff1a;t5db 将文件下载以后&#xff0c;解压到服务器 #执行所有docker-rpm包 yum -y localinstall *.rpm…

【你也能从零基础学会网站开发】Web建站之HTML+CSS入门篇 CSS层叠样式表语法基础

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享 &#x1f40b; 希望大家多多支持, 我们一起学习和进步&#xff01; &#x1f3c5; 欢迎评论 ❤️点赞&#x1f4ac;评论 &#x1f4c2;收藏 &#x1f4c2;加关注 什么是CSS?…

【机器学习】详解正则化思想

我们的生活当中真正有意义或者有价值的部分可以概括为两句话&#xff1a;一句话是&#xff1a;弄清楚某个东西是怎么一回事&#xff0c;另一句话是&#xff0c;弄清楚某个东西是怎么一回事。头一句话&#xff0c;我们弄清楚的那个东西对于我们而言是未知的&#xff0c;但是已经…

(学习总结)如何使用ChatGPT API训练自定义知识库

第一步&#xff1a; 安装OpenAI、GPT Index、PyPDF2和Gradio库 pip install openai pip install gpt_index pip install PyPDF2 pip install gradio 第二步&#xff1a;用VScode代码编辑器写app.py代码 记得替换api密钥 from llama_index import SimpleDirectoryReader, …

企智汇:引领企业项目管理的数字智能化管理系统工具!

随着数字化时代的来临&#xff0c;企业对项目管理的要求也日益增高。面对日益复杂的业务流程和海量数据&#xff0c;如何有效地管理项目、整合资源、优化流程、提高管理效率&#xff0c;成为了摆在企业面前的重要课题。在这样的背景下&#xff0c;专业做了10年项目管理系统的&a…

提高数字化处理质量和效率:重视OCR软件的识别准确率

在当今数字化时代&#xff0c;纸质文件的数字化处理变得尤为重要。而作为纸质文件数字化的关键工具之一&#xff0c;OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;软件的识别准确率对于将大量纸质文件转为Excel具有至关重要的地位。本文将…

Uninty 鼠标点击(摄像机发出射线-检测位置)

平面来触发碰撞&#xff0c;胶囊用红色材质方便观察。 脚本挂载到胶囊上方便操作。 目前实现的功能&#xff0c;鼠标左键点击&#xff0c;胶囊就移动到那个位置上。 using System.Collections; using System.Collections.Generic; using UnityEngine;public class c6 : MonoBe…

2024年AI辅助研发的技术革新与应用展望

文章目录 每日一句正能量前言AI辅助研发的技术进展全球AI应用呈现出百家争鸣、百花齐放态势&#xff0c;加速向各行各业渗透AI应用显著促进效率提升&#xff0c;“劳动替代低创造性脑力替代”正在加速形成 面临的挑战与机遇未来趋势预测后记 每日一句正能量 要理解这样的自己。…

智能部署之巅:Amazon SageMaker 引领机器学习革新

本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 &#xff08;全球 TMT 2023年12月6日讯&#xff09;亚马逊云科技在 2023 re:Invent 全…

IEEE投稿无法上传文件问题(An error has occurred.Please try again......)

投稿上传手稿出现&#xff1a; An error has occurred. Please try again. If the problem persists, please contact the Support Team for more information and instructions. The Support Teams contact information can be obtained by clicking the ‘Help’ link in the…

24/03/07总结

esayx: 贪吃蛇: #include "iostream" #include "cmath" #include "conio.h" #include "easyx.h" #include "time.h" #define NODE_WIDTH 40 using namespace std; typedef struct {int x;int y; }node; enum direction /…

融资项目——通过OpenFeign在分布式微服务框架中实现微服务的远程调用

1.OpenFeign配置 首先&#xff0c;在需要调用其他的微服务的微服务中引入相关依赖。&#xff08;大多数项目中各微服务需要互相调用&#xff0c;可以直接在每个微服务中引入依赖&#xff09; <!--服务调用--><dependency><groupId>org.springframework.clou…

非科班如何系统自学Python?

在数字化时代&#xff0c;Python如一位“全能选手”在编程语言的舞台上大放异彩&#xff0c;无论是数据科学、网站开发还是人工智能&#xff0c;它都能游刃有余地驾驭各种挑战。正因如此&#xff0c;越来越多的人渴望掌握这门兼具强大功能和优雅简洁的语言。 目录 引言 开始 …

pytorch(四、五)用pytorch实现线性回归和逻辑斯蒂回归(分类)

文章目录 线性回归代码过程准备数据设计模型设计构造函数与优化器训练过程训练代码和结果pytorch中的Linear层的底层原理&#xff08;个人喜欢&#xff0c;不用看&#xff09;普通矩阵乘法实现Linear层实现 回调机制 逻辑斯蒂回归模型损失函数代码和结果 线性回归 代码过程 训…

jumpserver项目配置讲解

下载地址&#xff1a;https://community.fit2cloud.com/#/products/jumpserver/downloads 产品文档&#xff1a;https://docs.jumpserver.org/zh/v3/ [rootbogon ~]# tar -xf jumpserver-offline-installer-v3.9.3-amd64.tar.gz [rootbogon ~]# cd jumpserver-offline-instal…

Python Tkinter GUI 基本概念

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;如果停止&#xff0c;就是低谷&#xf…

【机器学习】实验6,基于集成学习的 Amazon 用户评论质量预测

清华大学驭风计划课程链接 学堂在线 - 精品在线课程学习平台 (xuetangx.com) 代码和报告均为本人自己实现&#xff08;实验满分&#xff09;&#xff0c;此次代码开源大家可以自行参考学习 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟…

Go的安装

一. 下载地址 Go官方下载地址&#xff1a;https://golang.org/dl/ Go中文网&#xff1a;https://go.p2hp.com/go.dev/dl/ 根据不同系统下载不同的包。 二. 配置GOPATH GOPATH是一个环境变量&#xff0c;用来表明你写的go项目的存放路径。 GOPATH路径最好只设置一个&#xff0…