最近老师布置了要求实现MH\MR编码,但是比较奇怪的是,在网络上上关于这方面的资料很少,而且基本是介绍方法,没有对具体的编码进行介绍。(先挖个坑,上传编码上去,以后再具体介绍,代码中会有详细的注释,有些操作为了算法的速度,我进行了简化实现)

 MH编码

开头的码表解释一下,上面的码表有问题,因为哈夫曼编码是前缀码,而上面的编码中,有些编码居然是其他编码的前缀,这就很离谱,而且维基和百度上的一些资源基本都有问题,我通过检验是否为前缀码的,找出不是前缀码的编码,参考这些文献,最终得到了下面的码表,大家可以直接复制拿来用哦!!!

(没有使用EOL这个机制,不同行直接用数组存了)(如果需要用EOL也很简单,编码的时候,直接将他们编为一行即可,然后中间加入EOL;解码的时候拿EOL分割即可,或者加一个判断条件)

# 旧码表
# # 结尾码
# MH_BAI_63 = ["00110101","000111","0111","1000","1011","1100","1110","1111","10011","10100","00111","01000","001000","000011","110100","110101","101010","101011","0100111","0001100","0001000","001011","0000011","0000100","0101000","0101011","0010011","0100100","0011000","00000010","00000011","00011010","00011011","00010010","00010011","00010100","00010101","00010110","00010111","00101000","00101001","00101010","00101011","00101100","00101101","00000100","00000101","00001010","00001011","01010010","01010011","01010100","01010101","00100100","00100101","01011000","01011001","01011010","01011011","01001010","01001011","00110010","00110011","00110100"]
# MH_BLACK_63 = ["0000110111","010","11","10","011","0011","0010","00011","000101","000100","0000100","0000101","0000111","00000100","00000111","000011000","0000010111","0000011000","0000001000","00001100111","00001101000","00001101100","00000110111","00000101000","00000010111","00000011000","000011001010","000011001011","000011001100","000011001101","000001101000","000001101001","000001101010","000001101011","000011010010","000011010011","000011010100","000011010101","000011010110","000011010111","000001101100","000001101101","000011011010","000011011011","000001010100","000001010101","000001010110","000001010111","000001100100","000001100101","000001010010","000001010011","000000100100","000000110111","000000111000","000000100111","000000101000","000001011000","000001011001","000000101011","000000101100","000001011010","000001100110","000001100111"]
# # 组合基于码
# MH_BAI_128 = ["11011","10010","010111","0110111","00110110","00110111","01100100","01100101","01101000","01100111","011001100","011001101","011010010","011010011","011010100","011010101","011010110","011010111","011011000","011011001","011011010","011011011","010011000","010011001","010011010","011000","010011011"]
# MH_BLACK_128 = ["0000001111","000011001000","000011001001","000001011011","000000110011","000000110100","000000110101","0000001101100","0000001101101","0000001001010","0000001001011","0000001001100","0000001001101","0000001110010","000000111001","0000001110100","0000001110101","0000001110110","0000001110111","0000001010010","0000001010011","0000001010100","0000001010101","0000001011010","0000001011011","0000001100100","0000001100101"]# 新码表
MH_BAI_63 = ['00110101', '000111', '0111', '1000', '1011', '1100', '1110', '1111', '10011', '10100', '00111', '01000', '001000', '000011', '110100', '110101', '101010', '101011', '0100111', '0001100', '0001000', '0010111', '0000011', '0000100', '0101000', '0101011', '0010011', '0100100', '0011000', '00000010', '00000011', '00011010', '00011011', '00010010', '00010011', '00010100', '00010101', '00010110', '00010111', '00101000', '00101001', '00101010', '00101011', '00101100', '00101101', '00000100', '00000101', '00001010', '00001011', '01010010', '01010011', '01010100', '01010101', '00100100', '00100101', '01011000', '01011001', '01011010', '01011011', '01001010', '01001011', '00110010', '00110011', '00110100']
MH_BLACK_63 = ['0000110111', '010', '11', '10', '011', '0011', '0010', '00011', '000101', '000100', '0000100', '0000101', '0000111', '00000100', '00000111', '000011000', '0000010111', '0000011000', '0000001000', '00001100111', '00001101000', '00001101100', '00000110111', '00000101000', '00000010111', '00000011000', '000011001010', '000011001011', '000011001100', '000011001101', '000001101000', '000001101001', '000001101010', '000001101011', '000011010010', '000011010011', '000011010100', '000011010101', '000011010110', '000011010111', '000001101100', '000001101101', '000011011010', '000011011011', '000001010100', '000001010101', '000001010110', '000001010111', '000001100100', '000001100101', '000001010010', '000001010011', '000000100100', '000000110111', '000000111000', '000000100111', '000000101000', '000001011000', '000001011001', '000000101011', '000000101100', '000001011010', '000001100110', '000001100111']
MH_BAI_128 = ['11011', '10010', '010111', '0110111', '00110110', '00110111', '01100100', '01100101', '01101000', '01100111', '011001100', '011001101', '011010010', '101010011', '011010100', '011010101', '011010110', '011010111', '011011000', '011011001', '011011010', '011011011', '010011000', '010011001', '010011010', '011000', '010011011']
MH_BLACK_128 = ['0000001111', '00011001000', '000011001001', '000001011011', '000000110011', '000000110100', '000000110101', '0000001101100', '0000001101101', '0000001001010', '0000001001011', '0000001001100', '0000001001101', '0000001110010', '0000001110011', '0000001110100', '0000001110101', '0000001110110', '0000001110111', '0000001010010', '0000001010011', '0000001010100', '0000001010101', '0000001011010', '0000001011011', '0000001100100', '0000001100101']EOL = "000000000001"
# 第一个为64对应的数,以此类推,最后一个代表eol# 编码
def MH(inpu):temp = '0'  #通常白游程开始 ,用于记忆所扫描的相同字符tempnum = 0     #记忆当前扫描序列的首字符位置code = ''       #存取编码结果if inpu[0] == '1':# 若开头为1,则为黑游程开始,需要在前面输出黑游程对应为0的码# print(MH_BLACK_63[0], end='')code += MH_BLACK_63[0]temp = '1'for num in range(len(inpu)):if inpu[num] == temp:# 如果当前字符和之前字符相同,则搜寻下一个字符,直到字符不同continueif num-tempnum < 64:# 相同字符格式小于64个情况下if temp == '1':# 如果为黑游程# print(MH_BLACK_63[num-tempnum], end='')code += MH_BLACK_63[num-tempnum]else:# 如果为白游程# print(MH_BAI_63[num-tempnum], end='')code += MH_BAI_63[num-tempnum]else:# 在相同字符大于64情况下,需要加组合基于码rank = int((num - tempnum)/64) - 1if temp == '1':# print(MH_BLACK_128[rank], end='')code += MH_BLACK_128[rank]# print(MH_BLACK_63[(num - tempnum) % 64], end='')code += MH_BLACK_63[(num - tempnum) % 64]else:# print(MH_BAI_128[rank], end='')code += MH_BAI_128[rank]# print(MH_BAI_63[(num - tempnum) % 64], end='')code += MH_BAI_63[(num - tempnum) % 64]# 更新信息temp = inpu[num]tempnum = num# 输出最后一串if num-tempnum + 1 < 64:if temp == '1':# print(MH_BLACK_63[num-tempnum+1], end='')code += MH_BLACK_63[num-tempnum+1]else:# print(MH_BAI_63[num-tempnum+1], end='')code += MH_BAI_63[num-tempnum+1]else:rank = int((num - tempnum+1)/64) - 1if temp == '1':# print(MH_BLACK_128[rank], end='')code += MH_BLACK_128[rank]# print(MH_BLACK_63[(num - tempnum+1) % 64], end='')code += MH_BLACK_63[(num - tempnum+1) % 64]else:# print(MH_BAI_128[rank], end='')code += MH_BAI_128[rank]# print(MH_BAI_63[(num - tempnum+1) % 64], end='')code += MH_BAI_63[(num - tempnum+1) % 64]return codedef Search(src, MH):# 用于判断数组中是否包含给定的字符串if src in MH:# return Truereturn MH.index(src)else:return Falsedef output(number, char, code_trans):# 用于输出记录解码结果for i in range(number):# print(char, end='')code_trans += charreturn code_transdef SearchAll(src, temp):# 用于判断在数组中是否有相同的字符出现a = 0if temp == '1':if src in MH_BLACK_63:a += 1if src in MH_BLACK_128:a += 1else:if src in MH_BAI_63:a += 1if src in MH_BAI_128:a += 1if a == 0:return Trueelse:return False# 解码
def MH_trans(code):code_trans = ''     # 记忆解码结果temp = '0'          # 记忆当前所扫描的游程类型tempnum = 0         # 记忆当前扫描序列的首字符位置if code[0:10] == MH_BLACK_63[0]:# 即黑游程为开始temp = '1'tempnum = 10for num in range(len(code)):if num < tempnum:# 即此时为黑游程开始,则前10个字符代表结尾码中黑游程对应的长度为0的码,可以直接忽略continueif SearchAll(code[tempnum:num], temp):continueif temp == '1':# 判断是否存在组合基于码,如果存在,则先输出组合基于码对应的解码,再继续遍历寻找结尾码并输出。否则直接输出结尾码if code[tempnum:num] in MH_BLACK_128:youchen_128 = Search(code[tempnum:num], MH_BLACK_128)code_trans = output(youchen_128 * 64 + 64, '1', code_trans)temp = '1'tempnum = numelse:youchen_64 = Search(code[tempnum:num], MH_BLACK_63)code_trans = output(youchen_64, '1', code_trans)temp = '0'tempnum = numelse:# 判断是否存在组合基于码,如果存在,则先输出组合基于码对应的解码,再继续遍历寻找结尾码并输出。否则直接输出结尾码if code[tempnum:num] in MH_BAI_128:youchen_128 = Search(code[tempnum:num], MH_BAI_128)code_trans = output(youchen_128 * 64 + 64, '0', code_trans)temp = '0'tempnum = numelse:youchen_64 = Search(code[tempnum:num], MH_BAI_63)code_trans = output(youchen_64, '0', code_trans)temp = '1'tempnum = num#用于输出解码最后的结果,由于for循环的限制,无法对最后的字符串进行解码,故再对最后的字串需要解码一次num += 1if temp == '1':# 黑游程,编码中,由于是组合基于码+结尾码,或者直接为结尾码,故最后的码必定为结尾码,只需对结尾码进行生成即可youchen_64 = Search(code[tempnum:num], MH_BLACK_63)code_trans = output(youchen_64, '1', code_trans)else:# 白游程,编码中,由于是组合基于码+结尾码,或者直接为结尾码,故最后的码必定为结尾码,只需对结尾码进行生成即可youchen_64 = Search(code[tempnum:num], MH_BAI_63)# print(youchen_64)code_trans = output(youchen_64, '0', code_trans)return code_transdef makejpg (binary):strjpg = []for i in range(binary.shape[0]):strjpg.append('')for j in range(binary.shape[0]):if binary[i][j] >= 200:strjpg[i] += '1'else:strjpg[i] += '0'# strjpg中,分别存取图像中的每一行数据code = []for i in range(binary.shape[0]):code.append(MH(strjpg[i]))code_trans = []for i in range(binary.shape[0]):code_trans.append(MH_trans(code[i]))if len(code_trans[i]) != 256:print(str(i)+':'+str(len(code_trans[i])))# print(strjpg[228])# print(code[228])# print(code_trans[99])# print(MH(code_trans[99]))binary_trans = []for i in range(binary.shape[0]):temp = []# print(i)for j in range(len(code_trans[i])):# print(j)if code_trans[i][j] == '1':temp.append(255)else:temp.append(0)binary_trans.append(temp)return code, code_trans, binary_transdef MH_trans_in_MR(inpu, youchen, boolshouwei):# 用于在MR解码中的MH解码,此处解码较为特殊,每次只解一种字符,并且需要验证判断是否大于64位。# 同时,如果检索到组合基于码,还需要继续检索结尾码,并且该处属于同义词MH解码# 因此,要先判断是否存在组合基于码,如果存在,则需要继续搜索剩余的结尾码# 第二个返回值代表是否匹配到序列,第三个返回值代表是否需要继续搜索结尾码-code_trans = ''if youchen == '0':if inpu in MH_BAI_128:return output(MH_BAI_128.index(inpu) * 64 + 64, youchen, code_trans), True, True, Falseif inpu in MH_BAI_63:return output(MH_BAI_63.index(inpu), youchen, code_trans), True, False, Falseif youchen == '1':# 当其为黑游程开始时,由于MH编码的特性,在黑游程开始前会加入一串字符MH_BLACK_63[0]表示黑游程开始,但这串字符并无意义,故需要去掉# 这里可以考虑,当其搜到到MH_BLACK_63[0]时,需要继续进行一次搜索,但是当只有64个1像素时,此时依然后会搜索到MH_BLACK_63[0],并且不需要继续搜索,# 因此,这里只能通过增加返回值,来表示是最前面的MH_BLACK_63[0]还是最后的MH_BLACK_63[0]默认为TRUE,只有经过128位的查找之后才会变为FALSEif inpu in MH_BLACK_128:return output(MH_BLACK_128.index(inpu) * 64 + 64, youchen, code_trans), True, True, Falseif inpu in MH_BLACK_63:if boolshouwei == True:if inpu == MH_BLACK_63[0]:return output(MH_BLACK_63.index(inpu), youchen, code_trans), True, True, Falsereturn output(MH_BLACK_63.index(inpu), youchen, code_trans), True, False, Falsereturn 0, False, 0, boolshouwei# print(makejpg())# if __name__ == "main":
#     # 测试
#     # inpu = input('输入传输的内容:(0代表白游程,1代表黑游程,从白游程开始) ')
#
#     # 测试用例1
#     # inpu =''
#     # for i in range(110):
#     #     inpu += '0'
#     # inpu +='101010101'
#     # for i in range(200):
#     #     inpu += '1'
#
#     # 测试用例2
#     # inpu = '11001011010001001110001111111111111111111111111111111111111111111111111111111111111111111111111111111111111111100000000000000000000000000000000000000000000000000000000000000000000000000000000'
#     inpu = '11100'
#     code = MH(inpu)
#     print(code)
#     code_trans = MH_trans(code)
#     print(code_trans)

检验前缀码的方式:(还有更新数组,这样直接复制就行)

# 更新码表MH_BAI_63 = ["00110101","000111","0111","1000","1011","1100","1110","1111","10011","10100","00111","01000","001000","000011","110100","110101","101010","101011","0100111","0001100","0001000","001011","0000011","0000100","0101000","0101011","0010011","0100100","0011000","00000010","00000011","00011010","00011011","00010010","00010011","00010100","00010101","00010110","00010111","00101000","00101001","00101010","00101011","00101100","00101101","00000100","00000101","00001010","00001011","01010010","01010011","01010100","01010101","00100100","00100101","01011000","01011001","01011010","01011011","01001010","01001011","00110010","00110011","00110100"]
MH_BLACK_63 = ["0000110111","010","11","10","011","0011","0010","00011","000101","000100","0000100","0000101","0000111","00000100","00000111","000011000","0000010111","0000011000","0000001000","00001100111","00001101000","00001101100","00000110111","00000101000","00000010111","00000011000","000011001010","000011001011","000011001100","000011001101","000001101000","000001101001","000001101010","000001101011","000011010010","000011010011","000011010100","000011010101","000011010110","000011010111","000001101100","000001101101","000011011010","000011011011","000001010100","000001010101","000001010110","000001010111","000001100100","000001100101","000001010010","000001010011","000000100100","000000110111","000000111000","000000100111","000000101000","000001011000","000001011001","000000101011","000000101100","000001011010","000001100110","000001100111"]
# 组合基于码
MH_BAI_128 = ["11011","10010","010111","0110111","00110110","00110111","01100100","01100101","01101000","01100111","011001100","011001101","011010010","011010011","011010100","011010101","011010110","011010111","011011000","011011001","011011010","011011011","010011000","010011001","010011010","011000","010011011"]
MH_BLACK_128 = ["0000001111","000011001000","000011001001","000001011011","000000110011","000000110100","000000110101","0000001101100","0000001101101","0000001001010","0000001001011","0000001001100","0000001001101","0000001110010","000000111001","0000001110100","0000001110101","0000001110110","0000001110111","0000001010010","0000001010011","0000001010100","0000001010101","0000001011010","0000001011011","0000001100100","0000001100101"]
# TRL = ['00110101', '000111', '0111', '1000', '1011', '1100', '1110', '1111', '10011', '10100', '00111', '01000', '001000', '000011', '110100', '110101', '101010', '101011', '0100111', '0001100', '0001000', '001011', '0000011', '0000100', '0101000', '0101011', '0010011', '0100100', '0011000', '00000010', '00000011', '00011010', '00011011', '00010010', '00010011', '00010100', '00010101', '00010110', '00010111', '00101000', '00101001', '00101010', '00101011', '00101100', '00101101', '00000100', '00000101', '00001010', '00001011', '01010010', '01010011', '01010100', '01010101', '00100100', '00100101', '01011000', '01011001', '01011010', '01011011', '01001010', '01001011', '00110010', '00110011', '00110100']
MH_BAI_63[21] = '0010111'
MH_BAI_63[37] = '00010110'
MH_BAI_63[62] = '00110011'
MH_BAI_128[13] = '101010011'
MH_BLACK_128[0] = '0000001111'
MH_BLACK_128[1] = '00011001000'
MH_BLACK_128[14] = '0000001110011'print('MH_BAI_63 = '+str(MH_BAI_63))
print('MH_BLACK_63 = '+str(MH_BLACK_63))
print('MH_BAI_128 = '+str(MH_BAI_128))
print('MH_BLACK_128 = '+str(MH_BLACK_128))# 检验是否为前缀码
def jianyanqianzhui(MH):for i in range(len(MH)):src = MH[i]# 验证src是否是MH[i]的前缀for j in range(len(MH)):if i != j:if MH[j][:len(src)] == src:print(str(i)+':'+src+','+str(j)+':'+MH[j])
print('MH_BAI_63')
jianyanqianzhui(MH_BAI_63)
print('MH_BAI_128')
jianyanqianzhui(MH_BAI_128)
print('MH_BLACK_63')
jianyanqianzhui(MH_BLACK_63)
print('MH_BLACK_128')
jianyanqianzhui(MH_BLACK_128)

MR编码:


from MH import MH, MH_trans, SearchAll, MH_trans_in_MR
# 上面两个函数分别是指 MH编码 和 MH解码def bianma(a0, a1, a2, b1, b2, inpu2, code):# 通过各个元素的位置,输出编码以及a0的位置if a1 > b2:# print('0001', end=' ')code += '0001'return b2, codeelse:a1b1 = a1 - b1if a1b1 == 0:# print('1', end=' ')code += '1'return a1, codeelif a1b1 == 1:# print('011', end=' ')code += '011'return a1, codeelif a1b1 == 2:# print('000011', end=' ')code += '000011'return a1, codeelif a1b1 == 3:# print('0000011', end=' ')code += '0000011'return a1, codeelif a1b1 == -1:# print('010', end=' ')code += '010'return a1, codeelif a1b1 == -2:# print('000010', end=' ')code += '000010'return a1, codeelif a1b1 == -3:# print('0000010', end=' ')code += '0000010'return a1, codeelse:# 此时对应a1b1之间的距离大于3# print('001' + MH(inpu2[a0:a1]) + MH(inpu2[a1:a2]), end=' ')# 此时,如果以白游程开始,并且判定为水平模时,由于a0为-1位置,则获取不到该元素,a0实际代表白游程。故这里修改为当a0为-1是,前一段编码为0+0到a1位置的元素进行编码if a0 == -1:code += '001' + MH('0'+inpu2[:a1]) + MH(inpu2[a1:a2])else:code += '001' + MH(inpu2[a0:a1]) + MH(inpu2[a1:a2])return a2, codedef search(inpu, a1):# 在inpu序列中,找与a1的下一个迁移像素a2,a2与a1颜色相反# 迁移元素必须是由黑变白或者由白变黑的第一个元素if a1 == -1:# 即对应第一个为白元素的情况下,才会执行这句a1 = 0if a1 == len(inpu):return len(inpu)a2 = len(inpu)temp = inpu[a1]# print('search开始' + ',a1:' + str(a1)  + ',temp:' + temp)for i in range(a1, len(inpu)):if inpu[i] != temp:# print('i:'+str(i)+',a1:' + str(a1) + ', inpu[i]:' + inpu[i]+',temp:'+temp)a2 = ibreakreturn a2def searchcankao(inpu1, inpu2, a1):# inpu1代表参考行# inpu2代表编码行if a1 == len(inpu2):return len(inpu2)a2 = len(inpu1)temp = inpu2[a1]for i in range(a1+1, len(inpu1)):# 由于迁移元素表示由黑变白或由白变黑的第一个元素,因此不能单纯的从a1开始只找与a1不同的元素# 这里可以考虑从a1-1出发遍历,如果某元素与a1对应的元素不同,且与其上一个元素也不同,则可以认定为迁移元素# 即先看上一个元素和当前元素颜色是否不同,若不同再看a1对应的颜色和当前元素颜色是否不同if inpu1[i-1] != inpu1[i]:if temp != inpu1[i]:a2 = ibreakreturn a2# 通常扫描行第一个元素为白游程,若为黑游程则让a0为第一个元素之前# inpu1 代表参考行
# inpu2 代表编码行
def MR(inpu1,inpu2):a0 = -1          # a0是假想的白元素,将a0置于第一个元素之前code = ''if inpu2[0] == '1':# 即第一个为黑游程的情况下a1 = 0a2 = search(inpu2, a1)i = 0for i in range(len(inpu1)):if inpu1[i] == '1':breakb1 = i# 防止参考行均为0情况下,找不到b1的位置b2 = search(inpu1, b1)# print('a0:' + str(a0) + ',a1:' + str(a1) + ',a2:' + str(a2) + ',b1:' + str(b1) + ',b2:' + str(b2))a0, code = bianma(a0, a1, a2, b1, b2, inpu2, code)else:# 即对应第一个为白元素的情况下a1 = search(inpu2, a0)a2 = search(inpu2, a1)i = 0for i in range(len(inpu1)):if inpu1[i] == '1':breakb1 = i# 防止参考行均为0情况下,找不到b1的位置b2 = search(inpu1, b1)# print('a0:' + str(a0) + ',a1:' + str(a1) + ',a2:' + str(a2) + ',b1:' + str(b1) + ',b2:' + str(b2))a0, code = bianma(a0, a1, a2, b1, b2, inpu2, code)while 1:if a0 == len(inpu2):# 结束编码行编码break# 更新过程a1 = search(inpu2, a0)a2 = search(inpu2, a1)b1 = searchcankao(inpu1, inpu2, a0)# print('b1b2开始')b2 = search(inpu1, b1)# print('a0:' + str(a0) + ',a1:' + str(a1) + ',a2:' + str(a2) + ',b1:' + str(b1) + ',b2:' + str(b2))a0, code = bianma(a0, a1, a2, b1, b2, inpu2, code)return code# code 代表编码行的编码def output(num, youchen):# num代表输出的数量,youchen代表当前输出是0还是1code_trans = ''for i in range(num):code_trans += youchenreturn code_transdef searchcode(inpu1, src, a0, b1, b2, code_trans, youchen):# inpu1代表参考行,src代表当前选取的子序列,# 返回值:# code_trans代表复原的码,第二个代表游程是否改变,第三个代表是否搜索完毕# 通过搜索码字,确定a1、a2的位置if src == '1':# 对应a1等于b1的情况,code_trans += output(b1 - a0, youchen)return code_trans, True, Trueelif src == '011':code_trans += output(b1 + 1 - a0, youchen)return code_trans, True, Trueelif src == '000011':code_trans += output(b1 + 2 - a0, youchen)return code_trans, True, Trueelif src == '0000011':code_trans += output(b1 + 3 - a0, youchen)return code_trans, True, Trueelif src == '010':code_trans += output(b1 - 1 - a0, youchen)return code_trans, True, Trueelif src == '000010':code_trans += output(b1 - 2 - a0, youchen)return code_trans, True, Trueelif src == '0000010':code_trans += output(b1 - 3 - a0, youchen)return code_trans, True, Trueelif src == '0001':code_trans += output(b2 - a0, youchen)#这是游程不发生转变return code_trans, False, Trueelse:return code_trans, False, False# 对于水平模的情况,直接在父函数中判别def bianmaa1b1(a1,b1):# 初步判断code = ''a1b1 = a1 - b1if a1b1 == 0:# print('1', end=' ')code += '1'return codeelif a1b1 == -1:# print('010', end=' ')code += '010'return codeelif a1b1 == -2:# print('000010', end=' ')code += '000010'return codeelif a1b1 == -3:# print('0000010', end=' ')code += '0000010'return codeelse:# 此时对应a1b1之间的距离大于3# print('001' + MH(inpu2[a0:a1]) + MH(inpu2[a1:a2]), end=' ')code += '001'return codedef youchen_change(youchen):# 该youchen函数if youchen == '0':return '1'else:return '0'def searchyouchen(inpu, a0, youchen):# 得到inpu下一个迁移像素的位置,该迁移像素与youchen的颜色相反b1 = len(inpu)for i in range(a0+1, len(inpu)):if inpu[i-1] != inpu[i]:if inpu[i] != youchen:b1 = ibreakreturn b1# 解码def MR_trans(inpu1,code):# 通过搜索码字,确定a1、a2的位置,结合a0的位置,从而确定0,1的个数# 解码中,需要记录当前a0的位置(即以及解码好了的的字符的长度),b1、b2的位置由ao的位置获得# 首先要判断,该行是由白游程开始还是黑游程开始,具体的判断方法是:通过读取前面的码字,判断编码的模式,从而得到a1和b1的相对位置关系,而由参考行可以得到b1的位置,从而测定得到a1的位置#   若a1的位置为0,代表由黑游程开始,若a1位置不为0,代表由白游程开始。#   反向考虑,当且仅当a1位置为0时,为黑游程开始,基于此,可以简化运算,即得到b1的位置后,假定a1的位置为0,那么对于其相对位置关系可以得到的模式以及对应的码字,再判断改行码字前面与其是否匹配,#   若匹配,则为黑游程开始,若不匹配,则必定为白游程开始。#   在该假设的前提下,a1<=b1,则可以将其判断的模式范围缩小youchen = '0'tempnum = 0  # 记忆当前判断码字的初始位置code_trans = ''a0 = -1i = 0for i in range(len(inpu1)):if inpu1[i] == '1':breakb1 = ib2 = search(inpu1, b1)# a1 = 0# a1b1 = bianmaa1b1(a1, b1)# if code[0:len(a1b1)] == a1b1:#     # 即此时对应为开始为黑游程的情况#     youchen = '1'#     print('qwe')i = 1while a0 < len(inpu1):# print(src)src = code[tempnum:i]# print('src:'+src+',a0:'+str(a0)+',a0:'+str(a0)+',b1:'+str(b1)+',b2:'+str(b2)+',code_trans:'+str(code_trans) + ',youchen:'+str(youchen))code_trans, boolyouchen, boolsuccess = searchcode(inpu1, src, a0, b1, b2, code_trans, youchen)if boolsuccess == False :if src == '001':# 此时代表为水平模,需要进行两次MH编码# 由于这里MH编码不是简单的MH解码,需要是固定白或者黑游程确定# 第一次搜索j = i + 2# print(i)while 1:srcmh = code[i: j]# print(str(srcmh)+','+youchen)boolshouwei = Trueout, bool1, bool2, boolshouwei = MH_trans_in_MR(srcmh, youchen, boolshouwei)# 第二个返回值代表是否匹配到序列,第三个返回值代表是否需要继续搜索结尾码if not bool1:j += 1continueelse:# 此时代表成功搜索到字符code_trans += outif bool2:# 此时代表需要继续搜索结尾码i = jj = i + 2continueelse:break# 第二次搜索i = jj = i + 2while 1:srcmh = code[i: j]# print(srcmh+','+youchen_change(youchen))boolshouwei = Trueout, bool1, bool2, boolshouwei = MH_trans_in_MR(srcmh, youchen_change(youchen), boolshouwei)# 第二个返回值代表是否匹配到序列,第三个返回值代表是否需要继续搜索结尾码if not bool1:j += 1continueelse:# 此时代表成功搜索到字符code_trans += outif bool2:# 此时代表需要继续搜索结尾码i = jj = i + 2continueelse:breaktempnum = ji = tempnum + 1a0 = len(code_trans) - 1b1 = searchyouchen(inpu1, a0, youchen)b2 = search(inpu1, b1)continueelse:# 此时对应当前码字未搜索到需要的码i = i + 1a0 = len(code_trans) - 1continueelse:# 此时对应搜索编码成功的情况if boolyouchen == True:# 此时游程发生改变youchen = youchen_change(youchen)a0 = len(code_trans)-1b1 = searchyouchen(inpu1, a0, youchen)b2 = search(inpu1, b1)tempnum = ii = i + 1# print(a0)return code_trans[1:]def makejpgMR(binary):strjpg = []for i in range(binary.shape[0]):strjpg.append('')for j in range(binary.shape[0]):if binary[i][j] >= 200:strjpg[i] += '1'else:strjpg[i] += '0'# strjpg中,分别存取图像中的每一行数据code = []code.append(MH(strjpg[0]))      # 第一行进行MH编码for i in range(1, binary.shape[0]):code.append(MR(strjpg[i-1], strjpg[i]))         # 以i-1行为参考编i行code_trans = []code_trans.append(MH_trans(code[0]))        # 第一行进行MH解码for i in range(1, binary.shape[0]):code_trans.append(MR_trans(code_trans[i-1], code[i]))        # 以前一行解出来的码为参考行,对下一行进行解码if code_trans[i] != strjpg[i]:print(str(i) + ':' + str(len(code_trans[i])))print(strjpg[i-1])print(strjpg[i])print(code[i])print(code_trans[i])binary_trans = []for i in range(binary.shape[0]):temp = []# print(i)for j in range(len(code_trans[i])):# print(j)if code_trans[i][j] == '1':temp.append(255)else:temp.append(0)binary_trans.append(temp)return code, code_trans, binary_trans# if __name__ == "main":
#     # inpu1 = '001011101001010000'  # 参考行
#     # inpu2 = '000101101011010000'  # 编码行
inpu1 = ''  # 参考行
inpu2 = ''  # 编码行
inpu1 = '0000000000000011000000000000011000000000000000000000000000011100000000011000000110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011000000000000000000110000000000000000000000000000000'  # 参考行
inpu2 = '0000000000000011000000000000011000000000000000000000000000011000000000011100001110000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000101000111000000000000000000110000000000000000000000000000000'  # 编码行
# code = MR(inpu1, inpu2)
# print(code)
#
# print(MR_trans(inpu1, code))

测试文件(图像测试)


from MH import MH, MH_trans, makejpg
from MR import MR, MR_trans, makejpgMR
import cv2
import numpy as np# 读取图片
# # def change2binary(img):
#     img = cv2.imread("lina.jpg")
#     gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#     blocksize = 11
#     C = -40
#     binary = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blocksize, C)
#     cv2.imshow('binary', binary)
# cv2.imwrite('linabinary.jpg',binary)def getlen(binary):sum = 0for i in range(len(binary)):sum += len(binary[i])return sumbinary = cv2.imread('lina.jpg', cv2.IMREAD_GRAYSCALE)
# binary = cv2.imread('linabinary.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('binary', binary)
# code代表编码,binary_trans代表恢复后的图像print('原图像编码所占空间:'+str(getlen(binary)))# MH
codeMH, code_transMH, binary_transMH = makejpg(binary)
binary_transMH = np.array(binary_transMH, np.uint8)
cv2.imshow('MH', binary_transMH)
print('MH编码所占空间:'+str(getlen(codeMH))+'压缩比'+str(getlen(binary)/getlen(codeMH)))# MR
codeMR, code_transMR, binary_transMR = makejpgMR(binary)
binary_transMR = np.array(binary_transMR, np.uint8)
cv2.imshow('MR', binary_transMR)
print('MR编码所占空间:'+str(getlen(codeMR))+'压缩比'+str(getlen(binary)/getlen(codeMR)))cv2.waitKey(0)

测试结果:


原图像

 

MH编码后在解码恢复后的图像

MR编码后在解码恢复后的图像

 

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. SpringBoot 集成FluentMybatis 框架

    FluentMybatis特性 FluentMybatis原理 项目搭建 pom.xml 添加fluent-mybatis依赖 <properties><java.version>1.8</java.version><maven-jar-plugin.version>3.1.1</maven-jar-plugin.version><fluent-mybatis.version>1.8.7</fluent-…...

    2024/4/20 5:48:18
  2. 约瑟夫环问题的一般性解答

    注&#xff1a;本代码仅供参考&#xff0c;如果发生学术问题博主概不负责。 题目&#xff1a; N个人围成一圈&#xff0c;从第S个开始报数&#xff0c;每隔第M个将被杀掉&#xff0c;最后剩下X个&#xff0c;其余人都将被杀掉。例如N6&#xff0c;S1&#xff0c;M5&#xff0c;…...

    2024/4/24 5:06:14
  3. javascript_案例6表单检验

    <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>注册页面</title> <style>*{margin: 0px;padding: 0px;box-sizing: border-box;}body{background: url("img/register_bg.png")…...

    2024/4/15 6:38:52
  4. Alliance Advisors拓展在亚洲地区的业务

    任命新的香港和中国大陆业务发展副总裁 香港--(美国商业资讯)--全球领先的代理权征集和企业咨询公司Alliance Advisors欣然宣布&#xff0c;Gilbert Tam已加入Alliance的香港团队&#xff0c;担任业务发展副总裁。 Alliance亚太区负责人Ted Wallace表示&#xff1a;“随着我们不…...

    2024/4/24 14:42:07
  5. 每年的智能车竞赛赛道是如何产生的?

    简 介&#xff1a; 介绍了全国大学生智能车赛道设计的过程。 关键词&#xff1a; 智能车竞赛&#xff0c;赛道设计&#xff0c;车模 01 统一赛道设计每年全国大学生智能车竞赛考察了参赛同学们制作的车模作品在现场赛道上运行的性能。经过了一个多学期的准备&#xff0c;同学们…...

    2024/4/15 6:38:22
  6. Effective C++ 笔记(六)

    六&#xff1a;继承与面向对象设计 条款32&#xff1a;确定你的public继承塑模出is-a关系 如果你令class B&#xff08;派生类&#xff09;以public形式继承class A&#xff08;父类&#xff09;&#xff0c;你便是告诉C编译器说&#xff0c;每一个类型为D的对象同时也是一个类…...

    2024/4/19 17:18:27
  7. Docker从入门到干事,看这一篇就够了

    安装docker 鉴于同学们用的设备都不一样&#xff0c;不能让大家在第一步就被劝退&#xff0c;所以三个平台的安装方式都准备了&#xff0c;请自行选择。 不推荐在windows安装 mac 命令行安装 需要先安装homebrew homebrew国内镜像 /bin/zsh -c "$(curl -fsSL https://gi…...

    2024/4/20 20:08:16
  8. ubuntu16.04 install Android Studio

    操作步骤&#xff1a; 将您下载的 .zip 文件解压缩到您应用的相应位置&#xff0c;例如 /usr/local/ 中&#xff08;用于用户个人资料&#xff09;或者 /opt/ 中&#xff08;用于共享用户&#xff09;。 如果您使用的是 64 位版本的 Linux&#xff0c;请确保首先安装 64 位计算…...

    2024/4/7 0:18:26
  9. Scanner类

    用户交互Scanner 基本语法中并没有实现程序和人的交互&#xff0c;但是Java提供了一个工具类&#xff0c;可以获取用户的输入。java.util.Scanner是Java5的新特征&#xff0c;可以通过Scanner类来获取用户的输入。 通过Scanner类的next()与nextLine()方法获取输入的字符串&…...

    2024/4/25 18:16:44
  10. 可用版本 10分钟不断电,抖动也较小

    //包含C++常用头文件 #include <iostream> #include <sstream>//-->std::stringstream ss; #include <fstream>//保存数据到txt #include <cstdio>...

    2024/4/25 20:28:54
  11. vue+element 表格 删除 批量删除

    效果图 以作物表为例 这里有【批量删除】和【删除】 是 啊...

    2024/4/19 16:41:16
  12. 一个简单的指示灯控件开发过程

    指示灯控件是上位机开发中常用的一个控件&#xff0c;下面针对这个控件的开发给大家做下具体介绍&#xff1a; 控件的开发都是由简单到复杂的&#xff0c;所以整个开发过程是这样的&#xff1a; 首先是最原始的一个指示灯&#xff0c;其实就是一个填充了颜色的圆形&#xff0c;…...

    2024/4/25 18:28:09
  13. Stata安装外部命令报错stacktrace not available

    解决办法&#xff1a;Stata的安装文件夹都需要是英文的&#xff0c;不能有中文字符&#xff0c;换成英文路径就好了。参考文章Stata如何快速安装外部命令...

    2024/4/25 15:42:28
  14. linux安装包查找及安装

    包查找安装的命令形式&#xff0c;有两种为&#xff1a;apt 和 dpkg&#xff0c;&#xff0c;&#xff0c;一般常用的是apt命令&#xff1b; apt&#xff1a; 命令 作用 apt-cache search package 搜索包 apt-cache show package 获取包的相关信息&#xff0c;如说明、大小、…...

    2024/4/25 17:40:42
  15. Groovy 的多重赋值和方法的多返回值

    追溯到刚开始学习 Groovy 还是在 2008 年,距今 2018 年有九年半余,曾记下几篇 Groovy 的日志。那时学习 Groovy 并无明确的目的,只因它是脚本语言, 可用来快速验证 Java API。曾经 BeanShell 芸花一现,JRuby 和 Jython 总是别人家的语言照搬而来的。而 Scala,Nashorn(jjs…...

    2024/4/15 6:38:22
  16. MySQL常见函数2——数学函数

    1、round&#xff08;&#xff09; 四舍五入 SELECT ROUND(4.50); select round(4.77531,2); #小数点后保留两位 2、 ceil&#xff08;&#xff09; 向上取整&#xff0c;返回大于等于该参数的最小整数 SELECT CEIL(1.56); 3、 floor&#xff08;&#xff09; 向下取整&…...

    2024/4/19 21:59:41
  17. 华为、苹果接踵而至,Mini LED会是视觉时代下的“最优解”?

    如果说用户对电子产品哪项硬件要求变高了&#xff0c;毫无疑问是屏幕。 就像苹果在2019年推出iPhone11上一般&#xff0c;随着OLED成为手机屏幕的标配&#xff0c;苹果采用LCD&#xff0c;遭到无数果粉跟网友的吐槽。 随着时代的不断更迭&#xff0c;电子产品的功能及硬件逐渐…...

    2024/4/17 7:27:17
  18. 不使用插件,实现vscode中python文件头部注释和函数注释

    vscode中python文件头部注释和函数注释 我使用过koroFileHeader插件和vscode-FileHeader插件&#xff0c;有时候快捷键并不会产生注释&#xff0c;且注释风格不甚理想。因此寻找不使用插件的方式来实现注释。 文件-首选项-用户片段-python.json 搜索python,选择python.json…...

    2024/4/15 6:38:22
  19. Mapper.xml配置文件问题(又是找BUG)

    今天又遇到了java.lang.ExceptionInInitializerError这个问题&#xff0c;因为以前遇到过&#xff0c;所以习惯性的找pom配置文件&#xff0c;然后发现没有错有&#xff0c;又看mybats.xml配置文件中写mapper文件的路径什么的&#xff0c;来来回回地该&#xff0c;文件来来回回…...

    2024/4/24 10:17:10
  20. 异步复位为什么要同步释放 ?

    异步复位有什么问题&#xff1f; 一般来说&#xff0c;复位信号有效后会保持比较长一段时间&#xff0c;确保 register 被复位完成。但是复位信号释放时&#xff0c;因为其和时钟是异步的关系&#xff0c;我们不知道它会在什么时刻被释放。 首先看图1&#xff0c;考虑复位信号…...

    2024/4/19 17:10:16

最新文章

  1. 对策略模式的理解

    目录 一、场景1、题目描述 【[来源](https://kamacoder.com/problempage.php?pid1082)】2、输入描述3、输出描述4、输入示例5、输出示例 二、不使用策略模式三、使用策略模式1、不优雅的实现2、策略模式 简单工厂模式2.1 代码2.2 优点2.3 另一种实现方式 四、个人思考 一、场…...

    2024/4/27 1:19:19
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. vue3项目运行正常但vscode红色波浪线报错

    以下解决办法如不生效&#xff0c;可尝试 重启 vscode 一、Vetur插件检测问题 vetur 是一个 vscode 插件&#xff0c;用于为 .vue 单文件组件提供代码高亮以及语法支持。但 vue 以及 vetur 对于 ts 的支持&#xff0c;并不友好。 1、原因 如下图&#xff1a;鼠标放到红色波浪…...

    2024/4/26 17:21:41
  4. 文件系统 FTP Ubuntu 安装入门介绍

    FTP 环境: Ubuntu 14.04 blog zh_CN ubuntu14.04 Install 全新安装&#xff1a;apt-get install vsftpd 重新安装:apt-get --reinstall install vsftpd 卸载并清除配置文件&#xff1a;apt-get --purge remove vsftpd Start & Restart $ service vsftpd start $ se…...

    2024/4/26 19:07:53
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/25 18:39:23
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/25 16:48:44
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/26 16:00:35
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/26 22:01:59
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/25 18:38:57
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57